數組1
數組的聲明
- 一維數組的聲明方式:
- type var[]; 或 type[] var;
- 反例:Java語言中聲明數組時不能指定其長度(數組中元素的個數),例如:
- int a[5]; //非法
- 變量名稱,首字母小寫,合成單詞,依次首字母大寫:arrayList,
- 數組的靜態初始化:
- 數組的聲明和賦值在一行內完成。
- 數組的長度-1,就是該數組最大長度的下標
-
public static void main(String[] args) { //聲明一個數組 int[] nums1; int nums2[]; String strs[]; double[] arrays; }
- 遍歷數組中的每一個數,顯示
-
int[] arrays = {1,2,34,5,6,7,9,2}; System.out.println(arrays[0]); int i = arrays.length - 1;//數組的長度-1,就是該數組最大長度的下標 System.out.println(arrays[i]); //遍歷數組中的每一個數 System.out.println("===================="); for (int j = 0; j < arrays.length; j++) { System.out.println(arrays[j]); }
-
- 完成的課堂作業:倒敘輸出
-
//倒敘輸出數組中的每一個數 for(int j=arrays.length-1;j>=0;j--){ System.out.println(arrays[j]); }
-
- 動態初始化:數組定義與爲數組元素分配空間和賦值的操作分開進行
- 示例1
-
private static void m1() { int[] arrays;//聲明 arrays = new int[5];//分配空間 //賦值 arrays[0] = 60 ; arrays[1] = 70 ; arrays[4] = 10 ; //默認的空間裏面的數值是多少 for (int i = 0; i < arrays.length; i++) { System.out.println(arrays[i]); } }
-
- 綜合案例:
- 求一個班級的學生平均成績
-
public static int num; public static void main(String[] args) { int[] numbers = m2(); //定義一個總成績的變量 int totalScores = 0; for (int i = 0; i < numbers.length; i++) { totalScores +=numbers[i]; } System.out.println("總成績是:"+totalScores); System.out.println("平均成績是:"+totalScores/num); } private static int[] m2() { //創建Scanner對象 Scanner scanner = new Scanner(System.in); //提示用戶輸入學生的數量 System.out.println("輸入學生的人數:"); num = scanner.nextInt(); //創建數組:數組大小就是學生的人數 int[] scores = new int[num]; //使用循環,動態的接收用戶輸入的學生分數 for (int i = 0; i < scores.length; i++) { System.out.println("請輸入第"+(i+1)+"個學生的成績:"); scores[i] = scanner.nextInt(); } return scores; }
- 創建一個數組五個分數,裏面是各位評委的分數,要去掉最高分,去掉最低分,算出平均成績,而且要顯示哪個評委的分數最高,以及哪個評委的分數最低。
-
Scanner sc = new Scanner(System.in); // 創建數組 int[] scores = new int[5]; // 循環動態錄入數組中的元素 for (int i = 0; i < scores.length; i++) { System.out.println("請輸入第" + (i + 1) + "個評委的分數"); scores[i] = sc.nextInt(); } // 求最值問題 int max = scores[0]; int min = scores[0]; int total = scores[0]; int maxIndex = 0;//最大值下標 int minIndex = 0;//最小值下標 for (int i = 1; i < scores.length; i++) { if (scores[i] > max) { max = scores[i]; maxIndex = i; } if (scores[i] < min) { min = scores[i]; minIndex = i; } total += scores[i]; } int avg = (total - max - min) / (scores.length - 2); //輸出顯示 System.out.println("最大值是第"+(maxIndex+1)+"個評委的分數:"+max); System.out.println("最小值是第"+(minIndex+1)+"個評委的分數:"+min); System.out.println("平均成績:"+avg);
-
- 猜數遊戲
-
Scanner sc = new Scanner(System.in); // 生成隨機數 int num = (int) (Math.random() * 100 + 1); boolean flag = true; while (flag) { // 接收用戶輸入 System.out.println("請輸入您猜的數:"); int n = sc.nextInt(); // 判斷用戶輸入的大小 if (n > num) { System.out.println("大了");// 給與提示 } else if (n < num) { System.out.println("小了");// 給與提示 } else { System.out.println("猜對了,你真棒");// 給與提示 flag = false;// 關閉信號燈 } }
-
- 二分法查找:
- 確保查找的一個數列是有序的
- 核心突破點就是中間值的下標
-
// 一個有序的數列 int[] arrays = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; int key = 220; int min = 0; int max = arrays.length - 1; while (min <= max) { int middle = (min + max) / 2; if(key==arrays[middle]){ System.out.println("猜對了,它的索引位置是:"+middle); System.exit(0);//程序結束 } if(key>arrays[middle]){ min = middle + 1; }else{ max = middle - 1; } } System.out.println("沒有找到");
- 排序之Arrays排序
-
int[] arrays = { 34, 12, 55, 98, 67, 90, 1, 555, 76, 99 };// 無序數組 // 輸出該數組 System.out.println(Arrays.toString(arrays)); // 排序 Arrays.sort(arrays); // 輸出該數組 System.out.println(Arrays.toString(arrays));
-
- 冒泡排序
-
// 輸出該數組 System.out.println(Arrays.toString(arrays)); for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays.length - i - 1; j++) { if(arrays[j]<arrays[j+1]){ int temp = arrays[j]; arrays[j] = arrays[j+1]; arrays[j+1] = temp; } } } // 輸出該數組 System.out.println(Arrays.toString(arrays));
-
- 選擇排序
- 原理:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。也就是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小的記錄作爲有序序列中第i個記錄。基於此思想的算法主要有簡單選擇排序、樹型選擇排序和堆排序。
- 簡單選擇排序的基本思想:給定數組:int[] arr={裏面n個數據};第1趟排序,在待排序數據arr[1]~arr[n]中選出最小的數據,將它與arr[1]交換;第2趟,在待排序數據arr[2]~arr[n]中選出最小的數據,將它與r[2]交換;以此類推,第i趟在待排序數據arr[i]~arr[n]中選出最小的數據,將它與r[i]交換,直到全部排序完成。
-
System.out.println("交換之前:"); System.out.println(Arrays.toString(arrays)); //選擇排序的優化 for(int i = 0; i < arrays.length - 1; i++) {// 做第i趟排序 int k = i; for(int j = k + 1; j < arrays.length; j++){// 選最小的記錄 if(arrays[j] < arrays[k]){ k = j; //記下目前找到的最小值所在的位置 } } //在內層循環結束,也就是找到本輪循環的最小的數以後,再進行交換 if(i != k){ //交換a[i]和a[k] int temp = arrays[i]; arrays[i] = arrays[k]; arrays[k] = temp; } } System.out.println(); System.out.println("交換後:"); System.out.println(Arrays.toString(arrays));
- 數組是不能改變大小,錯誤案例示例:
-
int[] a = { 10, 20, 30 }; System.out.println(a); a = new int[5];// 分配空間,將新的空間地址給了a這個變量 System.out.println(a); a[3] = 40; a[4] = 50; System.out.println(Arrays.toString(a));
-
- 如何做到將一個數組中的所有數據正確的轉移到一個新大小的數組當中
-
int[] a = { 10, 20, 30 }; System.out.println(a); int[] b = Arrays.copyOf(a, 5); a = b; System.out.println(a); a[3] = 40; a[4] = 50; System.out.println(Arrays.toString(a));
-
- 作業輔導:思考如何在一個無序數列中進入一個插入
-
public static void main(String[] args) { int number = 3; int[] scores = { 7, 8, 5, 6, 9, 2, 4, 1 }; System.out.println(Arrays.toString(scores)); // 拷貝到一個新的大小數組中 scores = Arrays.copyOf(scores, scores.length + 1); System.out.println(Arrays.toString(scores)); // 排序 maopao(scores); System.out.println(Arrays.toString(scores)); // 找到插入的位置 int k = 0; for (; k < scores.length; k++) { if (scores[k] > number) { break; } } System.out.println("k=" + k); // 位移 for (int i = scores.length - 1; i > k; i--) { scores[i] = scores[i - 1]; } System.out.println(Arrays.toString(scores)); // 賦值(插入) scores[k] = number; System.out.println(Arrays.toString(scores)); } private static void maopao(int[] scores) { for (int i = 0; i < scores.length - 1; i++) { for (int j = 0; j < scores.length - i - 2; j++) { if (scores[j] > scores[j + 1]) { int temp = scores[j]; scores[j] = scores[j + 1]; scores[j + 1] = temp; } } } }
-
- 引用類型和值類型區別:
-
public static void main(String[] args) { int[] numbers = {1,2,3,4,5}; System.out.println(Arrays.toString(numbers)); m2(numbers); System.out.println(Arrays.toString(numbers)); /*int n = 100; System.out.println(n); m1(n); System.out.println(n);*/ } public static void m1(int number){ System.out.println("number="+number); number = 200; } public static void m2(int[] arrays){ arrays[2] = 666; }
-
- 二維數組示例1
-
// 首先靜態初始化一個:二維數組 int a[][] = { { 1, 2 }, { 3, 4, 5, 6 }, { 7, 8, 9 } }; //取值 System.out.println(a[0][0]); System.out.println(a[1][2]); System.out.println(a[2][2]); //設置:將 6 改爲999 System.out.println(a[1][3]); a[1][3] = 999; //輸出 System.out.println(a[1][3]);
-
//將二維數組遍歷: for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j]+"\t"); } System.out.println(); }
-
- 二維數組的動態初始化
-
//動態初始化二維數組 private static void v2() { String[][] s; s = new String[3][]; s[0] = new String[2]; s[1] = new String[3]; s[2] = new String[2]; for (int i = 0; i < s.length; i++) { for (int j = 0; j < s[i].length; j++) { s[i][j] = new String("我的位置是:" + i + "," + j); } } for (int i = 0; i < s.length; i++) { for (int j = 0; j < s[i].length; j++) { System.out.print(s[i][j] + " "); } System.out.println(); } }
-
- 楊輝三角形
-
private static void m1() { Scanner sc = new Scanner(System.in); System.out.println("請輸入幾行?"); int num = sc.nextInt(); int[][] arrays = new int[num][]; for (int i = 0; i < num; i++) { int cols = i + 1; arrays[i] = new int[cols]; for (int j = 0; j < cols; j++) { if (j == 0 || j == i) { arrays[i][j] = 1; } else { arrays[i][j] = arrays[i - 1][j - 1] + arrays[i - 1][j]; } } } for (int i = 0; i < arrays.length; i++) { System.out.println(Arrays.toString(arrays[i])); } }
-
- 接收3個學生的2門課成績,並顯示最後每門課的平均成績。
-
/** * 普通版,固定學生數,課程數 */ private static void m1() { Scanner sc = new Scanner(System.in); int[][] scores = new int[2][3]; for (int i = 0; i < scores.length; i++) { for (int j = 0; j < scores[i].length; j++) { System.out.println("第"+(i+1)+"個同學第"+(j+1)+"門課程的成績是:"); scores[i][j] = sc.nextInt();//動態錄入學生的成績 } } //遍歷輸出每個同學每門課的成績 for (int i = 0; i < scores.length; i++) { for (int j = 0; j < scores[i].length; j++) { System.out.print("第"+(i+1)+"個同學第"+(j+1)+"門課程的成績是:"+scores[i][j]+"\t"); } System.out.println();//每個學生用換行分隔 } //求每門課的平均成績 for (int j = 0; j < 3; j++) { int sum = 0; for (int i = 0; i < scores.length; i++) { sum += scores[i][j];//按照課程把每個學生的成績加起來 } System.out.println("第"+(j+1)+"門課的總成績是:"+sum+",平均成績是"+sum/2); } }
-