数组

第四章 数组

1 数组的声明

1.1 声明数组语法

  1. dataType[] arrayRefVar//Java首选方法
  2. dataType arrayRefVar[];//效果相同但不是首选方法,C语言和c++是这种,[]在变量名后
  3. 例如:int nums[];

1.2 创建数组语法

  1. dataType[] arrayRefVar = new dataType[arraySize];//Java首选方法
  2. dataType arrayRefVar[] = new dataType[arraySize];//效果相同但不是首选方法,C语言和c++的[]在变量名后
  3. 例如:int nums[] = new int[10];

1.3 Java内存分析

image

1.4 三种初始化

  1. 静态初始化,创建加赋值:int[] a = {1,2,3,4,5};
  2. 动态初始化,包含默认初始化,即不赋值默认为0:int[] b = new int[10];
  3. 数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化

1.4 数组的四个基本特点

  • 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。其元素必须是相同类型,不允许出现混合类型
  • 数组中的元素可以是任何数据类型,包括基本类型引用类型
  • 数组变量属引用类型数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象(它本身也是new出来的),Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的

1.5 数组边界

  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合
  • 数组也是对象(它本身也是new出来的)。数组元素相当于对象的成员变量
  • 数组长度的确定的,不可变的。如果越界,则报:ArraylndexOutofBounds

2 数组的使用

2.1 数组常见操作

int[] arrays = {1,2,3,4,5};

//输出数组所有元素
for (int i = 0; i < arrays.length; i++) {
    System.out.println(arrays[i]);
}
System.out.println("===============================================");

//输出所有元素之和
int sum = 0;
for (int i = 0; i < arrays.length; i++) {
    sum += arrays[i];
}
System.out.println("sum="+sum);
System.out.println("===============================================");

//查找数组最大元素
int max = arrays[0];//此处将max初始值设置为arrays[0]而不是任意数是因为要保证最大值一定要在数组中
for (int i = 1; i < arrays.length; i++) {
    if (arrays[i]>max){
        max = arrays[i];
    }
}
System.out.println("max="+max);

2.2 用foreach增强for循环遍历数组

  • Java5引入了一种主要用于数组或集合的增强型for循环
  • 语法如下:for(声明语句:表达式){//代码句子}
  • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配,其作用域限定在循环语句块,其值与此时数组元素的值相等
  • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法
  • 可用arrays(数组名).for生成for(int array : arrays){}快速编写增强for循环
int[] num = {10,20,30,40,50};
for (int x:num){
    System.out.println(x);//遍历num数组
}

2.3 反转数组算法

方法一:定义一个循环变量

public static int[] reverseArrays1(int[] arrays){
    int[] result = new int[arrays.length];

    for (int i = 0; i < arrays.length; i++) {
        result[i] = arrays[arrays.length - i - 1];
    }
    
    return result;
}

方法二:定义两个循环变量

public static int[] reverseArrays2(int[] arrays){
    int[] result = new int[arrays.length];

    for (int i = 0,j = arrays.length - 1; i < arrays.length; i++,j--) {//for循环可以定义多个循环变量
        result[i] = arrays[j];
    }

    return result;
}

3 多维数组

3.1 二维数组初始化

  • 静态初始化:int[][] arrays = {{1,2},{3,4,5},{5,6,7,8},{7,8,9},};
  • 动态初始化:int[][] arrays = new int[i][j]
int[][] arrays = {{1,2},{3,4,5},{5,6,7,8},{7,8,9},};

/*
    1,2       arrays[0]
    3,4,5     arrays[1]
    5,6,7,8   arrays[2]
    7,8,9     arrays[3]
 */

3.2 遍历二维数组

3.2.1 用for循环遍历二维数组

public static void printMultiArray(int arrays[][]){
    for (int i = 0; i < arrays.length; i++) {
        for (int j = 0; j < arrays[i].length; j++) {
            System.out.print(arrays[i][j]+"\t");
        }
        System.out.println("\n");
    }
}

3.2.2 用foreach增强for循环遍历二维数组

public static void printMultiArray2(int arrays[][]){
    for (int[] array : arrays) {
        for (int i : array) {
            System.out.print(i+"\t");
        }
        System.out.println("\n");
    }
}

4 Arrays类

4.1 打印数组元素方法Arrays.toString

  • public static String toString(int[] a){...}
package com.liam.array;

import java.util.Arrays;

public class ArrayDemo04 {
    public static void main(String[] args) {
        int[] a = {1,2,44,555,675,3345,2323};

        //打印数组元素方法Arrays.toString()
        System.out.println(Arrays.toString(a));
        printArrays(a);
    }

    public static void printArrays(int[] arrays){//自己编写的打印数组元素算法
        for (int i = 0; i < arrays.length; i++) {
            if (i==0){
                System.out.print("[");
            }else if(i==arrays.length-1){
                System.out.print(arrays[i]+"]");
                break;
            }

            System.out.print(arrays[i]+", ");
        }
    }
}

4.2 数组元素排序方法Arrays.sort

  • public static void sort(int[] a){...}
int[] a = {1,2,44,555,675,3345,2323};

Arrays.sort(a);
System.out.println(Arrays.toString(a));
//输出结果:[1, 2, 44, 555, 675, 2323, 3345]

4.3 数组填充方法Arrays.fill

fill(int[] a,int val)

int[] a = {1,2,44,555,675,3345,2323};

Arrays.fill(a,0);//选择一个数组,让其被某一个数值填满
System.out.println(Arrays.toString(a));//输出结果:[0, 0, 0, 0, 0, 0, 0]

fill(int[] a,int fromIndex,int toIndex,int val)

int[] a = {1,2,44,555,675,3345,2323};

Arrays.fill(a,3,5,0);//选择一个数组,输入起始下标,输入一个数值,结果是让起始下标中间的数值被输入的数值填满
System.out.println(Arrays.toString(a));

5 冒泡排序

  1. 比较数组中最后一个元素与倒数第二个元素的大小,小的数放在左边,大的数放在右边

  2. 再比较倒数第二与倒数第三的大小,小的数放在左边,大的数放在右边,同理依次比较直到最小的数到第一个元素的位置

  3. 每一轮都会产生一个最小数到最左边

  4. 每一轮都会减少一次排序

  5. 控制总循环次数最外层的for共arrays.length次循环,里层for循环负责控制小的数值向左靠近

    【优化】若数组本来就有序那么不用遍历数组元素,在第一次遍历数组的位置设置一个boolean标志变量boolean flag = true,若数组元素有元素变动则flag = false,若没有发生变动则表示数组元素是按顺序排列,此时若flag = true则直接跳出循环,可以减少没有意义的比较

package com.liam.array;

import java.util.Arrays;

public class ArrayDemo05 {
    public static void main(String[] args) {
        int[] a = {2,3,5,1,4,7,6};
        bubbleSort(a);
        System.out.println(Arrays.toString(a));
    }

    public static int[] bubbleSort(int[] a){
        int temp;
        for (int i = 0;i < a.length; i++) {
            boolean flag = true;
            for (int j = a.length - 1; j > i; j--) {
            if (a[j]<a[j-1]){
                temp = a[j-1];
                a[j-1] = a[j];
                a[j] = temp;
                flag = false;
            }
            if (flag){
                break;
            }
        }
        }

        return a;
    }
}

6 稀疏数组

6.1 稀疏数组含义

image

  • 第0行从左往右含义依次是:原二维数组有几行,原二维数组有几列,总共除了0一共有几个有效值

  • 第0行以后的行从左往右含义依次是:有效值是第几行,有效值是第几列,有效值的值

6.2 练习:将如下的稀疏数组转换成对应的压缩数组,并把压缩数组还原成原稀疏数组

image

package com.liam.array;

public class ArrayDemo06 {
    public static void main(String[] args) {
        //1. 创建原稀疏数组
        int[][] arrays = new int[11][11];
        arrays[1][2] = 1;
        arrays[2][3] = 2;
        printMultiArray(arrays);
        System.out.println("================================");

        //2. 转换成压缩数组前需要遍历原稀疏数组的有效值的数量以确定压缩数组行的长度(压缩数组列固定长度是3)
        int count = 0;//计算压缩矩阵行数
        for (int[] array : arrays) {
            for (int i : array) {
                if (i != 0){
                    count++;
                }
            }
        }
        //原数组为2个有效值

        //3. 创建压缩数组
        int[][] packedArrays = new int[count+1][3];
        packedArrays[0][0] = 11;
        packedArrays[0][1] = 11;
        packedArrays[0][2] = count;
        for (int i = 1; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                if (arrays[i][j] != 0){
                    packedArrays[i][0] = i;
                    packedArrays[i][1] = j;
                    packedArrays[i][2] = arrays[i][j];
                }
            }
        }
        printMultiArray(packedArrays);//打印压缩数组
        System.out.println("================================");

        //4. 将压缩数组还原为稀疏数组
        int[][] originalArrays = new int[packedArrays[0][0]][packedArrays[0][1]];
        for (int i = 1; i < packedArrays.length; i++) {
            for (int j = 0; j < packedArrays[i].length; j++) {
                originalArrays[packedArrays[i][0]][packedArrays[i][1]] = packedArrays[i][2];
            }
        }
        printMultiArray(originalArrays);
    }

    public static void printMultiArray(int arrays[][]){
        for (int[] array : arrays) {
            for (int i : array) {
                System.out.print(i+"\t");
            }
            System.out.println("\n");
        }
    }//打印二维数组方法
}
posted @ 2022-03-23 22:04  雪碧锅仔饭  阅读(52)  评论(0)    收藏  举报