第六章 数组

本文详细介绍了Java中数组的概念和使用,包括一维数组的定义、访问、复制、查找和排序,以及多维数组特别是二维数组的声明和操作。此外,还讲解了如何使用Arrays类进行数组的排序、查找、填充和转换,并展示了如何初始化和打印二维数组。同时,文中给出了数组扩容和排序算法(冒泡排序、插入排序)的示例代码。
摘要由CSDN通过智能技术生成

数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储具有相同类型 的变量集合会更有用。无须声明单个变量,例如:number0, number1,......... number99, 只要声明一个数组变量 numbers,并且用 numbers[0], numbers[1], .......numbers[99 ]来表示单个变量。

当给数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创 建数组之后就不能再修改它的大小。可以使用 arrayRefVar.length 得到数组的大小

当创建数组后,它的元素被賦予默认值,数值型基本数据类型的默认值为 0, char 型的 默认值为 AuOOOO’,boolean 型的默认值为 false。

一旦数组被创建,它的大小是固定的。使用一个數组引用变量,通过下标来访 问數组中的元素。

6.1 一维数组

定义数组

int[] matrix = {0,1,2,3,6,5};

访问数组

for(int i = 0; i < matrix.length; i++) {
    System.out.println(matrix[i]);
}

Java 支持一个简便的 for 循环,称为 foreach 循环,即不使用下标变量就可以顺序地遍 历整个数组。例如,下面的代码就可以显示数组 myList 的所有元素:

for (double e: myList) {

        System.out •println(e);

}

此代码可以读作 “ 对 myList 中每个元素 e 进行以下操作” 。注意,变量 e 必须声明为与 myList 中元素相同的数据类型。

数组复制

复制数组有三种方法:

        1 ) 使用循环语句逐个地复制数组的元素。

        2 ) 使用 System 类中的静态方法 arraycopy。

        3 )使用 clone 方法复制数组

int[] matrix1 = {2 , 3, 1, 5, 10};
int[] matrix2 = new int[matrix1.length]:
for Cint 1 - 0: i < matrix1.1enath: i++) {
    matrix2[i] = matrix1[i];
}

 数组的查找

①,线性查找法

线性査找法将要査找的关键字 key 与数组中的元素逐个进行比较。这个过程持续到在列 表中找到与关键字匹配的元素,或者査完列表也没有找到关键字为止。如果匹配成功,线性 査找法返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回 - 1。

public class LinearSearch {
    public static int 1inearSearch (int[] list, int key) {
        for (int i = 0;i < list.length;1++) {
            if (key == list[i])
            return i;
        }
        return -1;
   } 
}

②二分查找法

二分査找法是另一种常见的对数值列表的査找方法。使用二分査找法的前提条件是数组 中的元素必须已经排好序。假设数组已按升序排列。二分査找法首先将关键字与数组的中间 元素进行比较。

考虑下面三种情况:

• 如果关键字小于中间元素,只需要在数组的前一半元素中继续査找关键字。

• 如果关键字和中间元素相等,则匹配成功,査找结束。

• 如果关键字大于中间元素,只需要在数组的后一半元素中继续査找关键字。

 

public static int binarySearch(int[] list, int key) {
    int low = 0;
    int high = list.length - 1;
    int mid = (low + high) / 2;
    if(key < list[mid]) {
        high = mid - 1;
    }else if (key == list[mid]) {
        return mid;    
    }else {
        low = mid + 1;
    }
}

数组的排序

冒泡排序

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {2,3,5,4,6,7,9,8,1};
        for(int i = 0; i < arr.length - 1; i++) {
            for(int j = 0; j < arr.length - 1; j++) {
                if(arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

插入排序

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {3,6,4,2,1,9,7,8,5};
            for (int i = 1; i < arr.length; i++) {
                for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                        arr[j - 1] = temp;
                }
            }
        for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
        }
    }
}

数组扩容

public class ShuZuKuoRong {
    public static void main(String[] args) {
        int[] arr = {5,6,7,89,8,1,23,2};
        arr = add(arr,8);
        for(int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        
    }
    public static int[] add(int[] arr, int e) {
        int[] newArr = new int[arr.length + 1];
        for(int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        newArr[newArr.length - 1] = e;
        return newArr;
    }
}

 6.2 Arrays类

java.util.Arrays 类包括各种各样的静态方法,用于实现数组的排序和査找、数组的比 较和填充数组元素,以及返回数组的字符串表示。这些方法都有对所有基本类型的重载方法。

可以使用 sort 或者 parallelSort方法对整个数组或部分数组进行排序。例如,下面的 代码对数值型数组和字符型数组进行排序。

double[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 3.5};
java.util.Arrays.sort(numbers);// Sort the whole array
java.util.Arrays.parallelSort(numbers): // Sort the whole array
//可以调用sort(numbers)对整个数组 numbers 排序。可以调用sort(chars,l, 3)对从chars[l]到 charS[3-l]的部分数组排序。


char[] chars = {'a* , 'F', 'D', 'P'};
java.util .Arrays.sort(chars, 1,3);// Sort part of the array
java.util .Arrays.parallelSortfchars, 1, 3); // Sort part of the array

可以采用二分査找法( binarySearch 方法)在数组中査找关键字。数组必须提前按升序 排列好。如果数组中不存在关键字,方法返回 -( 插入点下标 +1)。

int[] list = {2 , 4, 7, 10, 11, 45 , 50 , 59, 60, 66 , 69, 70, 79 } ;
System.out.println("l. Index is " +java.util .Arrays.binarySearchflist, 11));
System.out.println("2. Index is " +java.util .Arrays.binarySearch(list, 12));

可以采用 equals 方法检测两个数组是否相等。如果它们的内容相同,那么这两个数组 相等。

int[] listl = {2 , 4 , 7, 10};
int[] list2 = {2 , 4 , 7 , 10};
int[] list3 = {4, 2 , 7 , 10}:
System.out.println(java.util.Arrays.equals(1istl, list2)); // true
System.out.println(java.util.Arrays.equals(1ist2 , 1ist3)); // false

可以使用 fill 方法填充整个数组或部分数组。

int[] listl = {2 , 4, 7, 10};
int[] list2= {2 , 4 , 7 , 7, 7, 10};
java.util.Arrays.fiil (list1, 5); // Fill 5 to the whole array
java.util.Arrays.fill(lisst2,1, 5, 8); // Fill 8 to a partial array
//可以使用 fill 方法填充整个数组或部分数组。例如:下列代码将 5 填充到 listl 中,将 8 填充到元素 list2[l] 到 list2 [5-l] 中。

 可以使用 toString 方法来返回一个字符串,该字符串代表了数组中的所有元素。这 是一个显示数组中所有元素的快捷和简便的方法。

int[] list = {2 f 4, 7, 10};
System.out.println(Arrays.toString(list));
//显示 [ 2 , 4 , 7, 10]。

 6.3 多维数组

6.3.1二维数组

下面是声明二维数组的语法:

数据类型[ ][ ]  数组名;

或者

数据类型 数组名 [ ][ ];

int[][] matrix;
int matrix[][];// 允许这种方式 ,但并不推荐使用它

 获取二维数组的长度

二维数组实际上是一个数组,它的每个元素都是一个一维数组。数组 X 的长度是数组中 元素的个数,可以用 x.length 获取该值。元素 x[0], x[l], … ,x[x.lengthl]也是数组。 可以使用 x[0].length, x[l].length, …,x[x.length1].length 获取它们的长度。

锯齿数组

二维数组中的每一行本身就是一个数组,因此,各行的长度就可以不同。这样的数组称为锯齿数组(ragged array)。

int[][] triangleArray = {
    {1, 2 , 3 , 4 t 5},
    {2. 3, 4 . 5},
    {3. 4 , 5},
    {4 , 5},
    {5}
};

 循环使用用户输人值初始化数组:

java.util.Scanner input = new Scanner(System.in);
System.out.println("enter" + matrix.length + "rows and" + matrix[0].length + " columns: ");
for(int row = 0; row < matrix .length; row++) {
    for(int column = 0; column < matrix[row].length; colum++) {
        matrix[row][column] = input.nextInt();
    }
}

循环使用 0 到 99 之间的随机值初始化数组:

for (int row * 0; row < matrix.length; row++){
    for (int column = 0; column < matrix[row].length; column++){
        matrix[row][column] = (int)(Math.random() * 100);
    }
}

为打印一个二维数组,必须使用如下所示的循环打印数组中的每个元素:

for (int row ■ 0; row < matrix.length; row++){
    for (int column = 0; column < matrix[row].length; column++){
        System.out.print(matrix[row][column] + " " );
    }
    System.out.println();
}

传递二维数组

import java.util.Scanner;

public static PassTwoDimensionalArray {
    public static void main(String[] args) {
        int[][] = getArray();
        System.out.println(sum(m));
    }
    public static int[][] getArray() {
        Scanner scanner = new Scanner(System.in);
        int[][] m = new int[3][4];
        for(int i = 0; i < m.length; i++) {
            for(int j = 0; j < m[i].length; j++) {
                m[i][j] = input.nextInt();
            }
        }
        return m;
    }
    public static int sum(int[][] m) {
        int total = 0;
        for(int row = 0; row < m.length; row++) {
            for(int column = 0; column < m[row].length; column+) {
                total += m[row][column];
            }
        }
        return total;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值