案例:
多维数组的定义和赋值
// 存储 3 个班各 5 名同学成绩
// 前面是一维数组的容量/长度
// 后面是二维数组的容量/长度
// double[][] scores = new double[3][5];
// 二维数组的长度可以不定义
double[][] scores = new double[3][];
socres[0] = new double[2];
socres[1] = new double[3];
socres[2] = new double[4];
// 给第1个班的第一名同学赋值
scores[0][0] = 20;
// 一维数组三种定义方式
int[] arr = new int[5];
int[] arr = {10, 20, 30, 40, 50};
int[] arr = new int[]{10, 20, 30, 40, 50};
// 二维数组三种定义方式
int[][] arr = new int[3][5];
int[][] arr = {{1, 2, 3},{1, 2, 3, 4, 5},{10, 20, 30, 40}};
int[][] arr = new int[][]{{1, 2, 3},{1, 2, 3, 4},{1, 2, 4, 7, 8, 9}};
多维数组的赋值
double[][] scores = new double[3][5];
scores[0][0] = 90;
scores[0][1] = 80;
scores[0][2] = 70;
scores[0][3] = 60;
scores[0][4] = 50;
scores[1][0] = 90;
scores[1][1] = 190;
scores[1][2] = 290;
scores[1][3] = 390;
scores[1][4] = 490;
scores[2][0] = 10;
scores[2][1] = 20;
scores[2][2] = 30;
scores[2][3] = 40;
scores[2][4] = 50;
循环录入赋值
double[][] scores = new double[3][5];
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
scores[i][j] = input.nextDouble();
}
}
计算三个班的总成绩和每个班的总成绩
int total = 0;
double[][] scores = new double[3][5];
for (int i = 0; i < scores.length; i++) {
int sum = 0;
for (int j = 0; j < scores[i].length; j++) {
sum += scores[i][j];
}
total += sum;
System.out.printf("第%d个班的总成绩为:%.1f", i+1, sum);
}
System.out.println("三个班的总成绩是:" + total);
冒泡排序
int[] arr = {9, 7, 8, 6, 2};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j] + arr[j+1];
arr[j] = temp - arr[j];
arr[j+1] = temp - arr[j+1];
}
}
}
System.out.println("排序后的结果为:" + Arrays.toString(arr));
// 升序排序判断时用 >
// 降序排序判断时用 <
// 挨着的两个元素值去比较,如果后边的比前边的小,交换位置,这是升序。
// 挨着的连个元素值去比较,如果后边的比前边的大,交换位置,这是降序。
选择排序
int[] arr = {9, 7, 8, 6, 2, 10};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
System.out.println("排序后的数组为:" + Arrays,toString(arr));
// 类似于打擂法
// 如果后面的比前一个小,交换位置,这是升序。
// 如果后边的比前一个大,交换位置,这是降序。
插入排序
int[] arr = {9, 7, 8, 6, 2, 10};
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j-1]) {
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
System.out.println("排序好的数组为:" + Arrays.toString(arr));
// 相当于小时候站队,一堆人一个一个的过来站队,然后从第二个开始过来的人就跟前面站好对的最后一个人
// 一个一个的去比较,如果比前一个小,那么就交换位置,升序依次类推。
// 相当于小时候站队,一堆人一个一个的过来站队,然后从第二个开始过来的人就跟前面站好对的最后一个人
// 一个一个的去比较,如果比前一个大,那么就交换位置,降序依次类推。
向一个数组中插入一个新的元素值
降序
int[] old = {99, 85, 82, 63, 60};
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = inout.nextInt();
int[] new = Arrays.copyOf(old,old.length + 1);
int index = new.length - 1;
for (int i = 0; i < new.length; i++) {
if (num > new[i]) {
index = i;
break;
}
}
for (int i = new.length - 1; i > index; i--) {
new[i] = new[i-1];
}
new[index] = num;
System.out.println("插入完新成绩的数列为:" + Arrays.toString(new));
储存问题:
// 放到虚拟机栈(简称栈:stack) 方法压栈 先进后出
int score = 10;
// 数据(元素值)放到堆(heap)里边
// int[] arr 放在栈里(存的是地址值(哈希值))
// new int[5] 放在堆里
int[] scores = new int[5];
// 拿着栈里 scores 的地址去找堆中他相对应的位置,然后赋值
scores[0] = 90;
引用数据类型把地址存在栈里(没有直接存放数据,存放的是地址)
基本数据类型把变量直接存在栈里
--------------------------------------------------------------------------------------------------------------------------------
作业:
作业1:
一个公司三个小组,求每个组的总金额及公司的总金额。
int[][] money = {{11, 12},{21, 22, 23},{31, 32, 33, 34}};
int total = 0;
for (int i = 0; i < money.length; i++) {
int sum = 0;
for (int j = 0; j < money[i].length; j++) {
sum += money[i][j];
}
total += sum;
System.out.printf("第%d个小组的总金额:%d\n", i+1, sum);
}
System.out.printf("公司总金额为:%d", total);
作业2:
求数组中元素值第二大的元素。
Scanner input = new Scanner(System.in);
int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
System.out.printf("这是第%d个数字:", i+1);
arr[i] = input.nextInt();
}
// 冒泡排序
for (int i = 1; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i -1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.printf("数组 arr 中元素值第二大的元素是:%d", arr[arr.length - 2]);
作业3:
1-100以内,十位数上是奇数的元素值加起来。
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
int sum = 0;
for (int j = 0; j < arr.length; j++) {
if (arr[j] > 9 && arr[j] / 10 % 2 != 0) {
sum += arr[j];
}
}
System.out.println("所有十位数值为奇数的元素相加的和为" + sum);
作业4:
向一个数组中插入一个元素,并保持降序排列。
Scanner input = new Scanner(System.in);
int[] old = {99, 85, 82, 63, 60};
int[] new = Arrays.copyOf(old.old.length + 1);
int index = new.length - 1;
System.out.println("请输入一个整数:");
int num = input.nextInt();
for (int i = 0; i < new.length; i++) {
if (num > new[i]) {
index = i;
break;
}
}
for (int i = new.length - 1; i > index; i--) {
new[i] = new[i-1];
}
new[index] = num;
System.out.println(Arrays.toString(new));