Java-05数组

  • 多写(代码),多写(笔记),多写(文章)
  • 多练(交流),多练(思维),多练(技能)
  • 多分享(知识),多分享(怎么了),多分享(为什么)
  • 最重要(坚持)
  • 每个牛B人物背后都有一段苦B的岁月,只要像傻B一样坚持,终将牛B!

1. 数组概述

数组的定义:

  • 数组是相同类型数据的有序集合
  • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
  • 每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问,且下标是从0开始

2. 数组声明创建

2.1 声明数组的语法:

dataType[] arrayRefVar; // 首选方法,推荐使用
dataType arrayRefVar[]; // 效果相同,但不推荐

例子:

int[] numbers;
int numbers[];

2.2 Java 语言使用new操作符(关键字)来创建数组,语法如下:

dataType[] arrayRefVar = new dataType[arraySize];

例子:

int[] numbers = new int[5];

2.3 获取数组的长度

arrayRefVar.length;

例子:

numbers.length;

2.4 数组初始化

2.4.1 静态初始化

int[] numbers = {1, 2, 3, 4, 5};
Person[] person = {new Person(), new Person(), new Person()}

2.4.2 动态初始化:包含默认初始化

int[] numbers = new int[5];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
numbers[4] = 5;

2.5 数组的四个基本特点

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

2.6 数组边界

下标的合法区间:[0, length - 1],如果越界就会抛出异常:

public static void main(String[] args) {
    int[] numbers = new int[2];
    // 会抛出ArrayIndexOutOfBoundsException:数组下标越界异常
    System.out.println(numbers[2]); 
}

3. 数组使用

3.1 For-Each 循环

public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5};

    // 普通for 循环
    for (int i = 0; i < numbers.length; i++) {
        System.out.println(numbers[i]);
    }
    System.out.println("==========华丽的分割线==========");
    // 增强for 循环(For-Each 循环)
    for (int number : numbers) {
        System.out.println(number);
    }
}

3.2 数组作为方法入参

public static void printArrays(int[] arrays) {
    for (int number : arrays) {
        System.out.print(number + " ");
    }
}

3.3 数组作为返回值

public static void main(String[] args) {
    int[] numbers = {1, 2, 3, 4, 5};

    for (int number : reverseArrays(numbers)) {
        System.out.print(number + " ");
    }

}

public static int[] reverseArrays(int[] arrays) {
    int[] result = new int[arrays.length];
    for (int i = 0, j = arrays.length - 1; i < arrays.length; i++, j--) {
        result[j] = arrays[i];
    }
    return result;
}

4. 多维数组

定义:多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组

二维数组:

// 此二维数组可以看成是一个两行五列的表格
int numbers[][] = new int[2][5];

二维数组的使用:

/* 定义了一个二维数组,可以看成是一个三行两列的表格
 * 第一行:1, 2
 * 第二行:3, 4
 * 第三行:5, 6
*/
int[][] numbers = {{1, 2}, {3, 4}, {5, 6}};

// 通过 for 循环来取值
for (int i = 0; i < numbers.length; i++) {
    for (int j = 0; j < numbers[i].length; j++) {
        System.out.println("第" + (i + 1) + "行" + "第" + (j + 1) + "列的值为:" + numbers[i][j] + " ");
    }
}

5. Arrays 类

  • 此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂
  • 除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException
  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用",而不是"不能"

具有以下常用功能:

  • 给数组赋值:通过fill 方法
  • 给数组排序:通过sort 方法,升序
  • 比较数组:通过equals 方法比较数组中元素值是否相等
  • 查找数组元素:通过binarySearch 方法能对排序好的数组进行二分查找法操作
public static void main(String[] args) {
    int[] numbers = {2, 6, 122, 63321, 1, -4, 33, 1};
    int[] temps = {2, 6, 122, 63321, 1, -4, 33, 100};
    // 打印数组中的每个元素的值
    System.out.println(Arrays.toString(numbers)); // [2, 6, 122, 63321, 1, -4, 33, 1]

    // 对数组中的元素进行升序排序
    Arrays.sort(numbers);
    System.out.println(Arrays.toString(numbers)); // [-4, 1, 1, 2, 6, 33, 122, 63321]

    // 比较两个数组中的值是否相等
    System.out.println(Arrays.equals(numbers, temps)); // false

    // 对数组中元素的值进行赋值
    Arrays.fill(numbers, 0);
    System.out.println(Arrays.toString(numbers)); // [0, 0, 0, 0, 0, 0, 0, 0]
}

冒泡排序例子:

  • 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法
  • 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成
  • 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

冒泡排序的原理:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
  • 针对所有的元素重复以上的步骤,除了最后一个
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
public class BubbleSort {
    public static void main(String[] args) {
        int[] numbers = {2, 6, 122, 63321, 1, -4, 33, 1};
        System.out.println(Arrays.toString(bubbleSort(numbers)));
    }

    /**
     * 冒泡排序
     * @param arrays 排序之前的int类型数组
     * @return 排序之后的int类型数组
     */
    public static int[] bubbleSort(int[] arrays) {
        for (int i = 0; i < arrays.length - 1; i++) {
            for (int j = 0; j < arrays.length - 1 - i; j++) {
                if (arrays[j] > arrays[j + 1]) {
                    int temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }
        return arrays;
    }
}

6. 稀疏数组

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值;把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

稀疏数组需求

如下图,左边是原始数组,右边是稀疏数组

稀疏数组图例

/**
 * 稀疏数组
 * @author Li.Xiangcheng
 * @date 2021-06-09
 */
public class SparseArray {
    public static void main(String[] args) {
        int[][] originalArray = printOriginalArray();
        int[][] sparseArray = getSparseArray(originalArray);
        getOriginalArrayBySparseArray(sparseArray);
    }

    /**
     * 创建一个二维原始数组,大小为:11*11,0 没有棋子;1 黑棋;2 白棋;
     * @return 维原始数组
     */
    public static int[][] printOriginalArray() {
        int[][] originalArray = new int[11][11];
        originalArray[1][2] = 1;
        originalArray[2][3] = 2;

        System.out.println("====================原始数组====================");
        for (int[] row : originalArray) {
            for (int column : row) {
                System.out.print(column + "\t");
            }
            System.out.println();
        }
        System.out.println("====================原始数组====================");
        return originalArray;
    }

    /**
     * 获取一个关于参数二维数组的稀疏数组
     * @param arrays 二维数组
     * @return 稀疏数组
     */
    public static int[][] getSparseArray(int[][] arrays) {
        int cellCount = 0;
        int rowCount = 0;
        int sum = 0;
        // 获取二维数组中的有效数个数
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                if (arrays[i][j] != 0) {
                    sum++;
                }
                cellCount++;
            }
            rowCount++;
        }
        System.out.println("原始数组的行数为:" + rowCount);
        System.out.println("原始数组的列数为:" + (cellCount / rowCount));
        System.out.println("原始数组的有效值个数为:" + sum);

        /*
         * 稀疏数组的格式:
         * 第一行记录一共有几行几列,有多少个不同值
         * 第二行往后记录在某行、某列、具体的值
         */
        int[][] sparseArray = new int[sum + 1][3];
        sparseArray[0][0] = rowCount;
        sparseArray[0][1] = (cellCount / rowCount);
        sparseArray[0][2] = sum;

        // 遍历二维数组中非0的值填充到稀疏数组
        int nextRowCount = 0;
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                if (arrays[i][j] != 0) {
                    nextRowCount++;
                    sparseArray[nextRowCount][0] = i;
                    sparseArray[nextRowCount][1] = j;
                    sparseArray[nextRowCount][2] = arrays[i][j];
                }
            }
        }
        System.out.println("====================稀疏数组====================");
        for (int[] row : sparseArray) {
            for (int column : row) {
                System.out.print(column + "\t");
            }
            System.out.println();
        }
        System.out.println("====================稀疏数组====================");
        return sparseArray;
    }

    /**
     * 通过稀疏数组还原二维数组
     * @param sparseArray 稀疏数组
     */
    public static void getOriginalArrayBySparseArray(int[][] sparseArray) {
        int[][] originalArrayBySparseArray = new int[sparseArray[0][0]][sparseArray[0][1]];

        // 还原稀疏数组
        for (int i = 1; i < sparseArray.length; i++) {
            originalArrayBySparseArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        System.out.println("====================还原后的数组====================");
        for (int[] row : originalArrayBySparseArray) {
            for (int column : row) {
                System.out.print(column + "\t");
            }
            System.out.println();
        }
        System.out.println("====================还原后的数组====================");
    }
}

稀疏数组运行结果

posted @ 2021-06-09 16:23  爱Ni说不出口  阅读(63)  评论(0)    收藏  举报