从零开始学Java【14】

从零开始学Java【14】


​ 学习视频:https://www.bilibili.com/video/BV12J41137hu?p=57

数组Arrays类

image-20220505090006298

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

image-20220505094215268

可以看到,因为是static修饰的方法,是可以对其直接调用的,不用新建一个对象再去调用

如果有什么不懂可以去jdk找解决方案。

还有一种方法,就是在程序里面找到这个类查看源码:

image-20220505093630264

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

image-20220505094325596

这些方法,比如Array.toString就是人写的方法,这些一个个方法叫做“轮子”,在写Java中要避免重复造轮子,有现成的方法直接用就好了

  • 排序数组:Array.sort()

比如先对数组进行排序,然后进行输出

image-20220505095609031

不能够:

int[] b= Arrays.sort(a);//错的

因为Arrays.sort是一个空方法,不能用变量来装载的。

还有一些其它方法,实际用到的时候再去jdk查看吧,如:fill,sort,equals,binarySearch方法都是常用的

  • fill

image-20220505101939321

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

image-20220505102129512

数组就进行了整体替换成0

使用上图第二种方法:

image-20220505102338739

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

  • equals

image-20220505102637900

image-20220505102937375

  • binarySearch

这个方法是当输入数组的任意一个值,就能找到这个值在当前这个数组的索引(在这个数组升序排列后才可以使用)

注:这个方法要先把数组进行升序排列才能正确显示值,不然会返回负数

image-20220505104118937

在未排序之前,比如值为50,因为50之前的数字都是升序的,所以能正常显示索引

值为4时,未排序会出现负数,所以进行排序之后才能正确显示索引

冒泡排序

  1. 比较数组中,两个相邻元素,如果第一个数比第二个数大,那么就交换他们的位置
  2. 每一次比较,都会产生一个最大,或者最小的数字
  3. 下一轮则可以少一次排序
  4. 依次循环,直到结束

image-20220505124000514

使用两次for循环来实现冒泡排序,第一层循环用来排序数组长度-1次,第二层循环用数组长度-1,再减去已经排序完了的i个数。结构体里面的方法则为两个数交换的方法,引入第三方变量temp作为容器来进行交换。

注:如果arrays[j+1] > arrays[j],则是降序排列,如果arrays[j+1] < arrays[j]则是升序排列,只需要改动if判断语句里面的布尔表达式就行

优化:

如果一开始都已经全部排好序了,就不用执行循环了,加入flag判断即可:

image-20220505125639439

image-20220505125654204

稀疏数组

image-20220505125831781

image-20220505130039305

把左边的矩阵保存成右边的样子,可以看到,左边有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循环

image-20220505131545971

对于增强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();
        }


    }
}
posted @ 2022-05-05 19:31  机智的小柴胡  阅读(33)  评论(0)    收藏  举报