数组的常见用法(下篇)

我们继续一起来学习有关数组的一些其他常见用法,比如如何求一组数里面的最大值、最小值,或者是对数组进行排列等等。

假设在代码中声明了一个int型数组userPoints,用来表示某一组用户的当前积分。

int[] userPoints = {42, 28, 37, 46, 9};

如果想要求出这组数据的最大值,我们可以这样编写代码,

int maxPoint = -1;
for (int userPoint : userPoints) {
    if (userPoint > maxPoint) {
        maxPoint = userPoint;
    }
}
System.out.print("最大的用户积分是");
System.out.println(maxPoint);

这段代码的核心思想是声明一个“跟踪”变量,并将其初始化值设置成一个比数组里面可能出现的最小值(比如0)还小一点的数字,这里设置成-1。

然后通过循环语句逐个比较数组的每个元素与这个跟踪变量谁大谁小,如果某个元素大于跟踪变量maxPoint,就将其值赋予变量maxPoint。这样变量maxPoint一直保持是当前遍历过的元素里面的最大值,一直到数组的最后一个元素。

大家如果在自己的电脑上运行上面这段代码,屏幕上会打印

最大的用户积分是46

如果想要知道拥有最大积分的是哪一个用户,或者说是第几个用户,我们可以采用类似的思路,新增一个变量用来跟踪数组索引,比如像下面这样。

int maxPoint = -1;
int nthUser = 0;
for (int i = 0; i < userPoints.length; i++) {
    if (userPoints[i] > maxPoint) {
        maxPoint = userPoints[i];
        nthUser = i;
    }
}
System.out.print("拥有最大用户积分");
System.out.print(maxPoint);
System.out.print("的是第");
System.out.print(nthUser+1);
System.out.println("个用户");

运行这段代码,我们的屏幕上会打印

拥有最大用户积分46的是第4个用户

在第十二行语句中,将变量nthUser的值加上了1,这是为了将说法与我们人类世界对齐。因为在Java代码中,索引标号是从0开始的,而我们人类习惯了从1开始计数。

采用示例代码里面类似的思路,我们可以很容易求出数组里面的最小用户积分,甚至知道积分最小的是第几个用户。这就交给大家自己去编写代码测试。

接下来我们一起来看看如何对一个数组进行排序。

在Java中,数组这一复合类型没有任何内部属性可以用来对数组进行排序,换句话说,也就是我们在编写代码时不能像这样“userPoints.sort()”。

如果要对数组排序,我们就必须使用Java工具包里面的Arrays类。关于包和类的概念大家暂时不用了解,后面时机到了我们会深入学习的。

反映到编写代码上面,就是我们需要在Java源代码文件的最前面添加下面这一行语句,

import java.util.Arrays;

Arrays这个类里面自带许多工具方法,比如sort()、toString()、equals()等等,用法就像我们一直在使用的println()一样,我们在编写代码时可以直接使用。

System.out.print("排序前: ");
System.out.println(Arrays.toString(userPoints));
Arrays.sort(userPoints);
System.out.print("排序后: ");
System.out.println(Arrays.toString(userPoints));

上面这段代码示例了toString()和sort()方法的使用。我们除了可以使用循环语句来打印数组的所有元素,可以使用Arrays.toString()将数组转换成一个包含其所有元素的字符串,然后再打印出来。对于Arrays.sort()方法,其在排序过程中会就地更改原数组。

大家如果运行这段代码,屏幕上会打印

排序前: [42, 28, 37, 46, 9]
排序后: [9, 28, 37, 42, 46]

从结果可以看出,sort()方法默认会对数组按从小到大进行升序排序。

如果想要比较两个数组是否相等,我们可以使用Arrays.equals()方法。这里需要说明一下,只有当两个数组的所有元素都相同,并且各个元素所在的位置也相同,那么这两个数组才是相等的。

int[] array1 = {1, 2, 3, 4, 5};
int[] array2 = {5, 4, 3, 2, 1};
int[] array3 = {1, 2, 3, 4, 5};
System.out.print("数组1与数组2是否相等: ");
System.out.println(Arrays.equals(array1, array2));
System.out.print("数组1与数组3是否相等: ");
System.out.println(Arrays.equals(array1, array3));

如果大家运行上面这段示例代码,我们的屏幕上会打印

数组1与数组2是否相等: false
数组1与数组3是否相等: true

值得注意的是,我们只能对两个类型相同的数组进行比较,比如int型数组与int型数组比较,不能用一个int型数组与另外一个double类型的数组比较。

至此有关数组的常见用法就讲解到这个程度,后面有需求再补充学习其他知识点。按照惯例,下面贴上本节教程的完整代码。

import java.util.Arrays;

public class ArrayDemo3 {
    public static void main(String[] args) {
        int[] userPoints = {42, 28, 37, 46, 9};

        // 求出某组用户积分里面的最大值
        // int maxPoint = -1;
        // for (int userPoint : userPoints) {
        //     if (userPoint > maxPoint) {
        //         maxPoint = userPoint;
        //     }
        // }
        // System.out.print("最大的用户积分是");
        // System.out.println(maxPoint);

        int maxPoint = -1;
        int nthUser = 0;
        for (int i = 0; i < userPoints.length; i++) {
            if (userPoints[i] > maxPoint) {
                maxPoint = userPoints[i];
                nthUser = i;
            }
        }
        System.out.print("拥有最大用户积分");
        System.out.print(maxPoint);
        System.out.print("的是第");
        System.out.print(nthUser+1);
        System.out.println("个用户");

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

        System.out.print("排序前: ");
        System.out.println(Arrays.toString(userPoints));
        Arrays.sort(userPoints);
        System.out.print("排序后: ");
        System.out.println(Arrays.toString(userPoints));

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

        int[] array1 = {1, 2, 3, 4, 5};
        int[] array2 = {5, 4, 3, 2, 1};
        int[] array3 = {1, 2, 3, 4, 5};
        System.out.print("数组1与数组2是否相等: ");
        System.out.println(Arrays.equals(array1, array2));
        System.out.print("数组1与数组3是否相等: ");
        System.out.println(Arrays.equals(array1, array3));
    }
}

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注