从零开始学Java【14】
从零开始学Java【14】
学习视频:https://www.bilibili.com/video/BV12J41137hu?p=57
数组Arrays类

如果想要具体知道这个类怎么用,可以打开jdk帮助文档(如jdk1.8帮助文档),打开索引搜索Array

可以看到,因为是static修饰的方法,是可以对其直接调用的,不用新建一个对象再去调用
如果有什么不懂可以去jdk找解决方案。
还有一种方法,就是在程序里面找到这个类查看源码:

- 打印数组元素:Array.toString()

这些方法,比如Array.toString就是人写的方法,这些一个个方法叫做“轮子”,在写Java中要避免重复造轮子,有现成的方法直接用就好了
- 排序数组:Array.sort()
比如先对数组进行排序,然后进行输出

不能够:
int[] b= Arrays.sort(a);//错的
因为Arrays.sort是一个空方法,不能用变量来装载的。
还有一些其它方法,实际用到的时候再去jdk查看吧,如:fill,sort,equals,binarySearch方法都是常用的
- fill

如填入整型,使用上图第一种方法

数组就进行了整体替换成0
使用上图第二种方法:

第二个和第四个下标索引的数组被填充为0
- equals


- binarySearch
这个方法是当输入数组的任意一个值,就能找到这个值在当前这个数组的索引(在这个数组升序排列后才可以使用)
注:这个方法要先把数组进行升序排列才能正确显示值,不然会返回负数

在未排序之前,比如值为50,因为50之前的数字都是升序的,所以能正常显示索引
值为4时,未排序会出现负数,所以进行排序之后才能正确显示索引
冒泡排序
- 比较数组中,两个相邻元素,如果第一个数比第二个数大,那么就交换他们的位置
- 每一次比较,都会产生一个最大,或者最小的数字
- 下一轮则可以少一次排序
- 依次循环,直到结束

使用两次for循环来实现冒泡排序,第一层循环用来排序数组长度-1次,第二层循环用数组长度-1,再减去已经排序完了的i个数。结构体里面的方法则为两个数交换的方法,引入第三方变量temp作为容器来进行交换。
注:如果arrays[j+1] > arrays[j],则是降序排列,如果arrays[j+1] < arrays[j]则是升序排列,只需要改动if判断语句里面的布尔表达式就行
优化:
如果一开始都已经全部排好序了,就不用执行循环了,加入flag判断即可:


稀疏数组


把左边的矩阵保存成右边的样子,可以看到,左边有6行7列,真正有效存储的值为22,15,11,17,-6,39,91,28总共8个数字的值,即8个值。把它保存到[0]这里。
而下面从[1]到[8]则记录了八个数字分别的坐标,比如第一个数字,在第0+1行3+1列,数的值为22,则被保存在了[1]中(因为是数组存储则从零开始算起),以此类推。
例子:
注:可以输出增强for来遍历数组,增强for循环是专门用于数组或者集合的,使用【数组名称.for】可以快速使用增强for循环

对于增强for循环的补充:
例如:
①使用普通for循环
int[] num = {1,2,3,4,5,6};
for(int i = 0 ; i<num.length ; i++){
System.out.println("元素:"+ num[i]);
}
②使用增强for循环
int[] num = {1,2,3,4,5,6};
for(int i :num){ //集合或数组a : 数组名称num
System.out.println("元素:"+ i);
}
那么这个例子中则为:
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
完整代码:
package com.zhang.array;
public class ArrayDemo08 {
public static void main(String[] args) {
//1.创建一个棋盘:二维数组 11*11,其中0:没有棋子,1:黑棋,2:白棋
int[][] array1 =new int[11][11];//创建棋盘
array1[1][2] = 1;
array1[2][3] = 2;//放置两颗棋子
//输出原始的数组
System.out.println("输出原始的数组");
//数组.for,可以输出增强for来遍历数组
//第一个for是打印二维数组中的一维数组,此时一维数组是作为变量的,即int[] ints
//第二个for是打印一维数组里面的元素,此时里面的元素是作为变量的,为anInt
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("==========");
/*太多0了,所以转换成稀疏数组来进行保存*/
// 获取有效值的个数
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数:"+sum);
//2.创建一个稀疏数组
//行数为有效值+1,即为sum+1,列固定为3列
int[][] array2 = new int[sum + 1][3];
//先开始打印头部
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍历二维数组,将非零的值存放在稀疏数组中
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
count++;
array2[count][0] = i;
array2[count][1] = i;
array2[count][2] = array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t");
}
System.out.println("==========");
System.out.println("还原");
//1.读取稀疏数组
int[][] array3 = new int[array2[0][0]][array2[0][1]];
//2.给其中的元素还原它的值
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//3.打印
//输出还原的数组
System.out.println("输出还原的数组");
//数组.for,可以输出增强for来遍历数组
//第一个for是打印二维数组中的一维数组,此时一维数组是作为变量的,即int[] ints
//第二个for是打印一维数组里面的元素,此时里面的元素是作为变量的,为anInt
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}

浙公网安备 33010602011771号