【原】Java学习笔记011 - 数组
1 package cn.temptation; 2 3 import java.util.Scanner; 4 5 public class Sample01 { 6 public static void main(String[] args) { 7 // 需求:定义一个数组存储星期一、星期二、...星期日,打印该数组形式为[星期一, 星期二, ...星期日],根据用户输入的数字(1~7),显示是星期几? 8 9 // 写法一、考虑使用字符串类型的数组 10 // // 1、创建一个数组来存储星期一、星期二、...星期日 11 // String[] weekDayArr = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; 12 // printArray(weekDayArr); 13 // 14 // // 2、接收键盘录入 15 // System.out.println("输入一个数字就可以找到对应是星期几:"); 16 // Scanner input = new Scanner(System.in); 17 // int weekDay = input.nextInt(); 18 // input.close(); 19 // 20 // // 3、判断输入的数字和数组中某个元素的索引之间的关系 21 // if (weekDay >= 1 && weekDay <= 7) { 22 // System.out.println("选择的是:" + weekDayArr[weekDay - 1]); 23 // } else { 24 // System.out.println("输入的数字不在范围内!"); 25 // } 26 27 // 写法二、考虑使用int类型的数组 28 // 1、创建一个数组来存储星期一、星期二、...星期日 29 int[] weekDayArr = { 1, 2, 3, 4, 5, 6, 7 }; 30 printArray(weekDayArr); 31 32 // 2、接收键盘录入 33 System.out.println("输入一个数字就可以找到对应是星期几:"); 34 Scanner input = new Scanner(System.in); 35 int weekDay = input.nextInt(); 36 input.close(); 37 38 // 3、判断输入的数字和数组中某个元素的索引之间的关系 39 if (weekDay >= 1 && weekDay <= 7) { 40 System.out.println("选择的是:" + convertNumberToString(weekDayArr[weekDay - 1])); 41 } else { 42 System.out.println("输入的数字不在范围内!"); 43 } 44 } 45 46 /** 47 * 打印数组 48 * @param arr:字符串数组 49 */ 50 public static void printArray(String[] arr) { 51 System.out.print("["); 52 53 // 遍历数组 54 for (int i = 0; i < arr.length; i++) { 55 if (i == arr.length - 1) { 56 System.out.print(arr[i] + "]"); 57 } else { 58 System.out.print(arr[i] + ","); 59 } 60 } 61 62 // 换行 63 System.out.println(); 64 } 65 66 /** 67 * 打印数组(重载方法) 68 * @param arr:int数组 69 */ 70 public static void printArray(int[] arr) { 71 System.out.print("["); 72 73 // 遍历数组 74 for (int i = 0; i < arr.length; i++) { 75 if (i == arr.length - 1) { 76 System.out.print(arr[i] + "]"); 77 } else { 78 System.out.print(arr[i] + ","); 79 } 80 } 81 82 // 换行 83 System.out.println(); 84 } 85 86 /** 87 * 数字转换为星期字符串的方法 88 * @param i:数字 89 * @return:星期字符串 90 */ 91 public static String convertNumberToString(int i) { 92 String result = ""; 93 94 switch (i) { 95 case 1: 96 result = "星期一"; 97 break; 98 case 2: 99 result = "星期二"; 100 break; 101 case 3: 102 result = "星期三"; 103 break; 104 case 4: 105 result = "星期四"; 106 break; 107 case 5: 108 result = "星期五"; 109 break; 110 case 6: 111 result = "星期六"; 112 break; 113 case 7: 114 result = "星期日"; 115 break; 116 default: 117 result = "输入错误!"; 118 break; 119 } 120 121 return result; 122 } 123 }
1 package cn.temptation; 2 3 public class Sample02 { 4 public static void main(String[] args) { 5 // 需求:给定一个int类型的数组,实现如下功能:将数组反转,比如:{1, 2, 3} -----> {3, 2, 1}, {1, 2, 3, 4} -----> {4, 3, 2, 1} 6 7 // 思路: 8 // 1、可能有两种情况,一种数组的长度为奇数,一种数组的长度为偶数 9 // 2、如果长度为奇数,中间那个元素不动,第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,..., 10 // 中间那个元素的前一个元素和中间那个元素的后一个元素对调 11 // 3、如果长度为偶数,第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,..., 12 // 中间位置的前一个元素和中间位置的后一个元素对调 13 14 int[] arr1 = { 1, 2, 3 }; 15 System.out.println("反转前的数组:"); 16 printArray(arr1); 17 18 // 调用方法 19 // reversalArray1(arr1); 20 reversalArray2(arr1); 21 22 System.out.println("反转后的数组:"); 23 printArray(arr1); 24 25 System.out.println("------------------------------"); 26 27 int[] arr2 = { 1, 2, 3, 4 }; 28 System.out.println("反转前的数组:"); 29 printArray(arr2); 30 31 // reversalArray2(arr2); 32 reversalArray1(arr2); 33 34 System.out.println("反转后的数组:"); 35 printArray(arr2); 36 37 // 注意: 38 // 1、代码写完后,自己再考虑一下,不要抱着糊完任务的心态 39 // 2、思考问题的时候是区分了数组为奇数长度和偶数长度的,在编写代码时,发现对于奇数长度,因为其中间元素不参与反转,相当于反转时把中间元素拿掉 40 // 即其操作次数:(数组长度 - 1) / 2, 和 偶数长度数组的操作次数是一致的 41 } 42 43 /** 44 * 打印数组 45 * @param arr:int数组 46 */ 47 public static void printArray(int[] arr) { 48 System.out.print("["); 49 50 // 遍历数组 51 for (int i = 0; i < arr.length; i++) { 52 if (i == arr.length - 1) { 53 System.out.print(arr[i] + "]"); 54 } else { 55 System.out.print(arr[i] + ","); 56 } 57 } 58 59 // 换行 60 System.out.println(); 61 } 62 63 /** 64 * 奇数长度的数组反转(因为后续的显示操作也是使用堆内存中的内容,所以该方法使用void:无返回即可) 65 * @param arr 66 */ 67 public static void reversalArray1(int[] arr) { 68 // 下面写法逻辑错误,这样会对调两次,等于没有对调 69 // for (int i = 0, j = arr.length - 1; i < arr.length; i++, j--) { 70 for (int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--) { 71 // 对调:第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,..., 72 // 中间那个元素的前一个元素和中间那个元素的后一个元素对调 73 // 定义临时变量接收 74 int temp = arr[i]; 75 arr[i] = arr[j]; 76 arr[j] = temp; 77 } 78 } 79 80 /** 81 * 偶数长度的数组反转(因为后续的显示操作也是使用堆内存中的内容,所以该方法使用void:无返回即可) 82 * @param arr 83 */ 84 public static void reversalArray2(int[] arr) { 85 for (int i = 0; i < arr.length / 2; i++) { 86 // 对调:第一个元素和最后一个元素对调,第二个元素和倒数第二个元素对调,..., 87 // 中间位置的前一个元素和中间位置的后一个元素对调 88 // 定义临时变量接收 89 int temp = arr[i]; 90 arr[i] = arr[arr.length - 1 - i]; 91 arr[arr.length - 1 - i] = temp; 92 } 93 } 94 }
1 package cn.temptation; 2 3 public class Sample03 { 4 public static void main(String[] args) { 5 int[] arr = { 10, 20, 30 }; 6 System.out.println(arr); // [I@15db9742 7 System.out.println(arr[0]); // 10 8 9 arr = null; 10 11 // 产生异常:java.lang.NullPointerException 空指针异常 12 // 有警告:Null pointer access: The variable arr can only be null at this location 13 // System.out.println(arr[0]); 14 15 // 产生异常:java.lang.NullPointerException 空指针异常 16 // 有警告:Null pointer access: The variable arr can only be null at this location 17 // System.out.println(arr.length); 18 19 // 下句语句执行时无异常 20 System.out.println(arr); // null 21 22 // 注意: 23 // 1、设置引用类型变量的值为null,其实就是让其栈中声明的引用类型变量 与 在堆中开辟的空间之间的联系断开 24 // 2、堆中原来开辟的空间并不会立即消失 25 26 // null是一个特殊值,类比boolean类型的特殊值true 和 false 27 // null表示的是引用数据类型的空值,引用数据类型的默认值是null 28 29 // 如下两种写法意义相同 30 // int[] arrExtend; 31 // int[] arrExtend = null; 32 33 // null不能用于给基本数据类型(值类型)赋值,null只能用于引用数据类型 34 // 语法错误:Type mismatch: cannot convert from null to int 35 // int i = null; 36 } 37 }
1 package cn.temptation; 2 3 public class Sample04 { 4 public static void main(String[] args) { 5 // int[] arr = { 1, 2, 3 }; 6 // printArray(arr); 7 8 // 匿名数组:没有显示定义数组名的数组 9 // 这里匿名数组使用new关键字直接在内存的堆中开辟元素个数长度的空间,并存储这些元素,然后作为实参传递给方法的形参供方法使用 10 11 // printArray(new int[] { 1, 2, 3 }); 12 13 // 匿名数组的优点:直接new出来使用,不用再做声明 14 // 匿名数组的缺点:只能使用一次(因为没有声明数组变量,一次使用完毕后就找不到了) 15 16 // 注意:匿名数组定义时,不能使用静态初始化的简写形式,语法出错 17 // 语法错误:Syntax error on token "printArray", @ expected before this token 18 // printArray({ 4, 5, 6 }); 19 20 // 注意:匿名数组定义时,可以使用动态初始化的形式,但是这样定义后,无法进行元素的填充 21 printArray(new int[3]); 22 } 23 24 /** 25 * 打印数组 26 * @param arr:int数组 27 */ 28 public static void printArray(int[] arr) { 29 System.out.print("["); 30 31 // 遍历数组 32 for (int i = 0; i < arr.length; i++) { 33 if (i == arr.length - 1) { 34 System.out.print(arr[i] + "]"); 35 } else { 36 System.out.print(arr[i] + ","); 37 } 38 } 39 40 // 换行 41 System.out.println(); 42 } 43 }
1 package cn.temptation; 2 3 public class Sample05 { 4 public static void main(String[] args) { 5 // 给方法传递值类型参数 和 给方法传递引用数据类型参数 6 7 int i = 1; 8 System.out.println(i); // 1 9 10 // 调用方法 11 show(i); // 3 12 13 System.out.println(i); // 1 14 15 System.out.println("------------------------------"); 16 17 int[] arr = { 1, 2, 3 }; 18 printArray(arr); // [1,2,3] 19 20 // 调用方法 21 show(arr); // [3,4,5] 22 23 printArray(arr); // [3,4,5] 24 } 25 26 // 方法接收的是值类型的参数 27 // i为形参,它接受show方法调用时传递过来的实参 28 // show方法中使用的i叫做局部变量,声明该局部变量的地方是形参定义的地方,也是它的作用域开始的地方,作用域结束的地方是show方法右侧的大括号 29 public static void show(int i) { 30 i += 2; 31 System.out.println("方法内的参数值为:" + i); 32 } 33 34 // 方法接收的是引用类型的参数 35 // 传递引用类型的参数,其实传递的是堆内存中开辟的空间的地址(也就是所谓的把引用传递了过去) 36 public static void show(int[] arr) { 37 // 遍历数组 38 for (int i = 0; i < arr.length; i++) { 39 arr[i] += 2; 40 } 41 42 // 打印数组 43 printArray(arr); 44 } 45 46 /** 47 * 打印数组 48 * @param arr:int数组 49 */ 50 public static void printArray(int[] arr) { 51 System.out.print("["); 52 53 // 遍历数组 54 for (int i = 0; i < arr.length; i++) { 55 if (i == arr.length - 1) { 56 System.out.print(arr[i] + "]"); 57 } else { 58 System.out.print(arr[i] + ","); 59 } 60 } 61 62 // 换行 63 System.out.println(); 64 } 65 }
1 package cn.temptation; 2 3 public class Sample06 { 4 public static void main(String[] args) { 5 // 可变长参数:Java中当作数组处理 6 // 可变长参数一般出现在方法的形参中 7 8 // 调用方法 9 show(1, new double[] { 2, 3, 4 }); 10 11 double[] arr = { 5, 6, 7 }; 12 show(9, arr); 13 } 14 15 // 正确形式使用可变长参数 16 public static void show(int i, double... ds) { 17 System.out.println(i); // 1 18 19 System.out.println(ds); // [D@15db9742 20 System.out.println(ds.length); // 3 21 22 // 遍历 23 for (double item : ds) { 24 System.out.println(item); 25 } 26 } 27 28 // 注意:一个方法只能有一个可变长参数,且必须位于参数列表的最后位置 29 30 // 语法错误:The variable argument type double of the method test must be the last parameter 31 // public static void test(int i, double... ds, char... ch) { 32 // // 想创建多个可变长参数的方法 33 // } 34 35 // 语法错误:The variable argument type double of the method test must be the last parameter 36 // public static void test(int i, double... ds, boolean flag) { 37 // // 想创建可变长参数不在最后位置的方法 38 // } 39 }
1 package cn.temptation; 2 3 public class Sample07 { 4 public static void main(String[] args) { 5 // 排序 6 7 // 冒泡排序(两两位置比较,每轮最大数字出现在右侧,依次向左) 8 // 思路: 9 // 1、第一轮,比较第1个位置和第2个位置上的数,将较小的数放在第1个位置上,较大的数放在第2个位置上 10 // 比较第2个位置和第3个位置上的数,将较小的数放在第2个位置上,较大的数放在第3个位置上 11 // 以此类推直到第一轮结束(最后一个位置不用参与比较,因为它的右侧没有位置了),最大的数字在最右侧 12 // 2、第二轮,还是比较第1个位置和第2个位置上的数,将较小的数放在第1个位置上,较大的数放在第2个位置上 13 // 比较第2个位置和第3个位置上的数,将较小的数放在第2个位置上,较大的数放在第3个位置上 14 // 以此类推直到第二轮结束(倒数第二个位置不用参与比较,因为它的右侧已经是最大的数了),第二大的数字在倒数第二个 15 // 3、后续的轮以此类推 16 17 int[] arr = { 2, 1, 0, 4, 3 }; 18 19 System.out.println("排序前:"); 20 printArray(arr); 21 22 // 冒泡排序算法 23 for (int i = 0; i < arr.length - 1; i++) { // 外层循环的轮数是数组长度 - 1,i表示的是当前为第几轮 24 for (int j = 0; j < arr.length - 1 - i; j++) { // j表示的当前轮中的位置 25 // 相邻的两个位置上的数做比较 26 if (arr[j] > arr[j + 1]) { 27 // 对调 28 int temp = arr[j]; 29 arr[j] = arr[j + 1]; 30 arr[j + 1] = temp; 31 } 32 } 33 34 // 可以使用打印数组的方法查看当轮排序结果 35 printArray(arr); 36 } 37 38 System.out.println("排序后:"); 39 printArray(arr); 40 } 41 42 /** 43 * 打印数组 44 * @param arr:int数组 45 */ 46 public static void printArray(int[] arr) { 47 System.out.print("["); 48 49 // 遍历数组 50 for (int i = 0; i < arr.length; i++) { 51 if (i == arr.length - 1) { 52 System.out.print(arr[i] + "]"); 53 } else { 54 System.out.print(arr[i] + ","); 55 } 56 } 57 58 // 换行 59 System.out.println(); 60 } 61 }
1 package cn.temptation; 2 3 public class Sample08 { 4 public static void main(String[] args) { 5 // 排序 6 7 // 选择排序 8 // 思路: 9 // 1、第一轮,把在第一个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第一个位置上的元素小,就对调,直到比较到最后一个位置上的元素 10 // 第一轮操作完成后,在第一个位置上得到最小的那个元素 11 // 2、第二轮,把在第二个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第二个位置上的元素小,就对调,直到比较到最后一个位置上的元素 12 // 第二轮操作完成后,在第二个位置上得到次小的那个元素 13 // 3、以此类推 14 15 int[] arr = { 2, 1, 0, 4, 3 }; 16 17 System.out.println("排序前:"); 18 printArray(arr); 19 20 // 选择排序算法 21 for (int i = 0; i < arr.length - 1; i++) { // 外层循环的i既表示轮数,又表示比较的位置 22 // 第一轮,把在第一个位置上的元素依次和后续位置上的元素进行比较,如果被比较的元素比第一个位置上的元素小,就对调,直到比较到最后一个位置上的元素 23 // if (arr[0] > arr[1]) { 24 // // 对调 25 // int temp = arr[0]; 26 // arr[0] = arr[1]; 27 // arr[1] = temp; 28 // } 29 // if (arr[0] > arr[2]) { 30 // // 对调 31 // int temp = arr[0]; 32 // arr[0] = arr[2]; 33 // arr[2] = temp; 34 // } 35 36 // 归纳上述语句,可以得到规律 37 for (int j = i + 1; j < arr.length; j++) { // 内层循环的j表示其他被比较的位置 38 if (arr[i] > arr[j]) { 39 // 对调 40 int temp = arr[i]; 41 arr[i] = arr[j]; 42 arr[j] = temp; 43 } 44 } 45 46 // 可以使用打印数组的方法查看当轮排序结果 47 printArray(arr); 48 } 49 50 System.out.println("排序后:"); 51 printArray(arr); 52 } 53 54 /** 55 * 打印数组 56 * @param arr:int数组 57 */ 58 public static void printArray(int[] arr) { 59 System.out.print("["); 60 61 // 遍历数组 62 for (int i = 0; i < arr.length; i++) { 63 if (i == arr.length - 1) { 64 System.out.print(arr[i] + "]"); 65 } else { 66 System.out.print(arr[i] + ","); 67 } 68 } 69 70 // 换行 71 System.out.println(); 72 } 73 }
1 package cn.temptation; 2 3 public class Sample09 { 4 public static void main(String[] args) { 5 // 排序 6 7 // 插入排序 8 // 思路: 9 // 1、第一轮,从第2个位置开始,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面 10 // 2、第二轮,从第3个位置开始,和其左侧的紧靠着它的位置的数(第2个位置上的数)进行比较,小的数放前面,大的数放后面 11 // 再看第2个位置,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面 12 // 3、第三轮,从第4个位置开始,和其左侧的紧靠着它的位置的数(第3个位置上的数)进行比较,小的数放前面,大的数放后面 13 // 再看第3个位置,和其左侧的紧靠着它的位置的数(第2个位置上的数)进行比较,小的数放前面,大的数放后面 14 // 再看第2个位置,和其左侧的紧靠着它的位置的数(第1个位置上的数)进行比较,小的数放前面,大的数放后面 15 // 4、以此类推 16 17 int[] arr = { 2, 1, 0, 4, 3 }; 18 19 System.out.println("排序前:"); 20 printArray(arr); 21 22 // 插入排序算法 23 for (int i = 1; i < arr.length; i++) { // 外层循环的i既表示轮数,又表示位置 24 // // 第一轮操作 25 // if (arr[0] > arr[1]) { 26 // // 对调 27 // int temp = arr[0]; 28 // arr[0] = arr[1]; 29 // arr[1] = temp; 30 // } 31 // 32 // // 第二轮操作 33 // if (arr[1] > arr[2]) { 34 // // 对调 35 // int temp = arr[1]; 36 // arr[1] = arr[2]; 37 // arr[2] = temp; 38 // } 39 // if (arr[0] > arr[1]) { 40 // // 对调 41 // int temp = arr[0]; 42 // arr[0] = arr[1]; 43 // arr[1] = temp; 44 // } 45 46 // 归纳上述操作,得到规律 47 // 写法一 48 for (int j = i; j > 0; j--) { // 内层循环的j表示当前的这个位置 49 if (arr[j] < arr[j - 1]) { // // 内层循环的当前的这个位置上的数 和 其左侧紧靠着它的位置上的数进行比较 50 // 对调 51 int temp = arr[j]; 52 arr[j] = arr[j - 1]; 53 arr[j - 1] = temp; 54 } 55 } 56 57 // 写法二 58 // for (int j = 0; j < i; j++) { // 内层循环的j表示从第1个位置开始配合进行比较 59 // if (arr[j] > arr[i]) { 60 // // 对调 61 // int temp = arr[i]; 62 // arr[i] = arr[j]; 63 // arr[j] = temp; 64 // } 65 // } 66 } 67 68 System.out.println("排序后:"); 69 printArray(arr); 70 } 71 72 /** 73 * 打印数组 74 * @param arr:int数组 75 */ 76 public static void printArray(int[] arr) { 77 System.out.print("["); 78 79 // 遍历数组 80 for (int i = 0; i < arr.length; i++) { 81 if (i == arr.length - 1) { 82 System.out.print(arr[i] + "]"); 83 } else { 84 System.out.print(arr[i] + ","); 85 } 86 } 87 88 // 换行 89 System.out.println(); 90 } 91 }
1 package cn.temptation; 2 3 import java.util.Arrays; 4 5 public class Sample10 { 6 public static void main(String[] args) { 7 // 初始化数组 8 int[] arr = { 2, 1, 0, 4, 3 }; 9 10 System.out.println("排序前:"); 11 printArray(arr); 12 13 // 可以调用Arrays类的sort方法进行排序 14 // 类 Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法。 15 // 常用的成员方法: 16 // static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。 17 Arrays.sort(arr); 18 19 System.out.println("排序后:"); 20 printArray(arr); 21 } 22 23 /** 24 * 打印数组 25 * @param arr:int数组 26 */ 27 public static void printArray(int[] arr) { 28 System.out.print("["); 29 30 // 遍历数组 31 for (int i = 0; i < arr.length; i++) { 32 if (i == arr.length - 1) { 33 System.out.print(arr[i] + "]"); 34 } else { 35 System.out.print(arr[i] + ","); 36 } 37 } 38 39 // 换行 40 System.out.println(); 41 } 42 }