数组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); } }
-