Day07-Java数组

数组

数组是相同类型数据的有序集合

数组定义

dataType [] arrayName = new dataType[arrayName.size]

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int [] a = new int[15];	//定义一个长度为15的整数数组
        int [] b = new int[sc.nextInt()];	//定义一个通过输入决定长度的数组
        int [] nums;	//声明一个数组
        nums = new int[10];	//创建一个数组
        nums[0] = 1;		//给元素赋值
        Scanner.close();
    }
}

数组内存分析

image-20210208205345937

数组特点

  1. 长度确定。数组一旦创建,大小不可改变
  2. 数组元素必须相同,不允许混合类型
  3. 数组的元素可以是引用类型
  4. 数组可看成对象,每个元素相当于该对象的成员变量
  5. 数组保存在堆中

数组边界

下标的合法区间:[0,length-1]

ArrayIndexOutOfBoundsException:数组下标越界异常

数组使用

循环结合

查找最大元素

public class Main{
    public static void main(String[] args){
        int [] a = {1,2,3,4,5,2};
        int max = a[0];
        for(int i = 0;i<a.length;i++){
            if (max<a[i]){
                max = a[i];
            }
        }
    }
}

增强型for循环

public class Main{
    public static void main(String[] args){
        for(int array:a){
            System.out.println(a);	//打印输出数组
        }
    }
}

反转数组

public class Main{
    public static void main(String[] args){
        int []a={1,2,3,4,5}
        int []reserve=reserve(a);
        printArray(reserve);
    }
    public static int [] reserve(int []array){	//定义一个数据类型为数组的方法
        int []result = new int[array.length];
        for(int i =0,j=result.length-1;i<array.length;i++,j--){
            result[j]=array[i];
        }
        return result;        
    }
    public static void printArray(int []array){	//定义一个打印数组的方法
        for(int i =0;i<array.length;i++){
            System.out.println(array[i])
        }
    }
}

多维数组

二维数组

public class Main{
    public static void main(String[] args){
        int [][]a=new int[2][5];	//定义一个两行五列的数组
        int [][]b={{1,2},{1,3},{1,3}};	//定义了一个三行两列的二维数组
        /*
        	1,2		b[0]
        	1,3		b[1]
        	1,3		b[2]
        */
        printArray(b[0]);	//此时输出的是1 ,2
        printArray(b[0,0]); //此时输出的是1
        System.out.println(b.length);	//3
        System.out.println(b[0].length);//2
    }
    public static void printArray(int []array){	//定义一个打印数组的方法
        for(int i =0;i<array.length;i++){
            System.out.println(array[i])
        }
    }
}

稀疏数组

当一个数组大部分元素为0,或者同一值时,可以使用稀疏数组来保存数据

image-20210208221454861

方式:第[0]行写的是这个数组的行数和列数,还有存储的值的数量

​ 数组中行列均以0开始,计算,如22即为第0行第三列的元素

public class ArraysTest {
    public static void main(String[] args) {
        int[][] a=new int [11][11]; //创建一个11行11列的数组来充当棋盘
        a[2][4] = 1;
        a[9][6] = 1;                //改变某几个位置的值,充当落子效果
        System.out.println();


        for(int[] row: a){          //先将二维数组的每一行转化为1个数组
            for(int col : row){     //将每一行对应的数输出
                System.out.print(col+"\t");
            }
            System.out.println();
        }

        System.out.println("=========================================");


        int sum=0;                  //计算棋盘中落子个数
        for (int i = 0; i <11 ; i++) {
            for (int j = 0; j <11 ; j++) {
                if(a[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("落子个数:"+sum);

        int[][] b =new int[sum+1][3];
        int count = 0;  //count用来判断是从哪一行开始添加稀疏数组的元素
        /*
            创建一个稀疏数组,固定为三列,第一列为存放落子位置的横坐标,第二列存放落子位置的列坐标
            数组表头需要来存放原数组行数列数和落子个数,行数需要比落子个数加1
        */
        b[0][0] =11;    //一共11行
        b[0][1] =11;    //一共11列
        b[0][2] =sum;   //一共落子数量
        for (int i = 0; i <a.length ; i++) {    //二维数组使用length时默认输出的是行数
            for (int j = 0; j <a[i].length ; j++) { //a[i]是行,每一行都包含一个一维数组为列,循环遍历
                if(a[i][j]!=0){
                    count++;                        //因为第一行已经被行列值个数占据,所以从第二行开始
                    b[count][0]=i;                  //存放行
                    b[count][1]=j;                  //存放列
                    b[count][2]=a[i][j];            //存放值
                }
            }
        }



        //输出稀疏数组
        for(int c[]:b){
            for(int d:c){
                System.out.print(d+"\t");
            }
            System.out.println();
        }

        System.out.println("=========================================");

        //还原稀疏数组
        int[][] e = new int[b[0][0]][b[0][1]];      //稀疏素组第一行的前两个元素代表行列\
        //将落子位置赋值为棋盘
        for (int i = 1; i <b.length ; i++) {
            e[b[i][0]][b[i][1]]=b[i][2];
        }
        //将棋盘打印输出
        for(int[] row: e){          //先将二维数组的每一行转化为1个数组
            for(int col : row){     //将每一行对应的数输出
                System.out.print(col+"\t");
            }
            System.out.println();
        }
    }
}

posted @ 2021-02-08 22:53  2月2日  阅读(71)  评论(0)    收藏  举报