在实际开发当中我们更多的会使用集合来代替数组,但是集合的底层也是基于数组来实现的,所以花了一些时间对数组的知识点进行了复习巩固,并在此对一些知识点进行记录。
后续在实际开发过程中遇到的关于数组的一些实际案例以及问题的解决方案,也会在此进行记录。
public static void main(String[] args) {
//声明数组
int[][] arr = new int[10][];
//数组赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = new int[i + 1];
//给行首行末赋值1
arr[i][0] = arr[i][i] = 1;
//给非时行首末赋值
for (int j = 1; j < arr[i].length - 1; j++) {
//从三行开始,除行首末外的值等于:前一行且前一列的项 + 前一行同一列的项
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
}
//输出数组
for (int[] ints : arr) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
}
输出结果
public static void main(String[] args) {
int [] arr = new int[]{11,22,33,44,55,66};
int target = 55;
int head = 0;
int end = arr.length - 1;
boolean isflag = false;
while (head <= end){
int middle = (head + end) / 2;
if(arr[middle] == target){
System.out.println("找到了,坐标在 " + middle);
isflag = true;
break;
}else if(arr[middle] > target){
//当前的middle值比目标大,改变end的值为middle的前一位
end = middle - 1;
}else{
head = middle + 1;
}
}
if(!isflag) System.out.println("未找到");
}
执行结果
案例代码如下
public static void main(String[] args) {
int [] arr = new int[]{12,13,-51,11,-99,55,3,133,666};
//冒泡排序
for (int i = 0; i < arr.length; i++) {
//内循环每轮都从数组开始的位置与前一项进行比对
for (int j = 0; j < arr.length - 1 - i; j++) { //保证每轮内循环排序后比对的数量都减少一位
if(arr[j] > arr[j + 1]){
//交换变量的值
arr[j] = arr[j] + arr[j+1]; // A = A + B
arr[j + 1] = arr[j] - arr[j + 1]; // B = A = (A+B) - B
arr[j] = arr[j] - arr[j + 1]; // A = B = (A+B) - A
}
}
}
//遍历数组
for (int item: arr) {
System.out.print(item + " ");
}
}
冒泡排序执行过程
排序思路以及案例:
待补充
快速排序的执行过程如下
暂时只收集动态效果图,具体案例待后续补充
需求:
1、从键盘输入本组学员的成绩,放到数组中
2、用for循环显示所有学员的成绩
3、排序:从低到高
4、查找是否有正好60分的,如果有返回位置
5、复制成绩最低三名构成新数组
6、用工具类打印成绩最低三名成绩
public static void main(String[] args){
//1、声明一个数组并创建一个数组
int[] scores = new int[5];
//2、从键盘输入成绩
Scanner input = new Scanner(System.in);
for(int i=0; i<scores.length; i++){
//成绩存在数组的元素中
//为元素赋值
System.out.print("请输入第" + (i+1) + "个学员的成绩:");
scores[i] = input.nextInt();
}
//3、显示成绩
//用foreach显示所有学员的成绩
System.out.println("本组学员的成绩如下:");
for(int s = 0; s < scores.length;i++){
System.out.println(scores[s]);
}
//4、排序:从低到高
Arrays.sort(scores);
System.out.println("排序后的结果:" + Arrays.toString(scores));
//5、查找60分
int index = Arrays.binarySearch(scores, 60);
if(index<0){
System.out.println("没有正好60分的");
}else{
System.out.println("60分的索引位置:" + index);
}
//6、复制成绩最低三名构成新数组
//int[] newArray = Arrays.copyOfRange(scores, 0, 3);
int[] newArray = Arrays.copyOf(scores, 3);
//7、用工具类打印成绩最低三名成绩
System.out.println("成绩最低的三名同学是:" + Arrays.toString(newArray));
}
数组角标越界异常,访问数组的下标越界时
例如:
int[] arr = new int[2];
System.out.println(arr[ 2]);
System.out.println(arr[-1]);
访问到了数组中的不存在的脚标时发生。
空指针异常,以下是出现该异常时的一些场景
null
时
null
的数组下标
null
的对象的一些相关方法时
例如 arr[0] = null
,执行了 arr[0].toString()
待补充
操作二维数组不应使用常数来控制维数。具体方法是 array.length
表示行数,array[row].length
来表示 row
行的列数。这样当数组行数和列数不相等时,代码可以自动调整为正确的值。
待补充