John Squirrels
第 41 级
San Francisco

数组类

已在 随机的 群组中发布
个会员
再一次问好!:) 在今天的课程中,我们将讨论 Java 中的 Arrays 类。上节课我们认识了这样一种数据结构,叫做数组。我们学习了如何创建它们并用数据填充它们。我们研究了它们是如何存储在内存中的。今天,我们将研究您在实际工作中经常看到的一些使用数组的任务和示例。例如,想象一下这种情况:我们有一个包含 10 个随机数的数组。
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我们的任务是按升序对这个数组进行排序:从小到大。最后,它应该是这样的: [-234, -2, 16, 26, 35, 43, 92, 99, 167] 我们该怎么做呢?这项任务并不简单。我们以前从未这样做过:/有什么想法吗?猜猜看。这是一种解决方案:
  • 遍历数组的所有元素。将每个元素与下一个元素进行比较([0] 与 [1]、[1] 与 [2]、[2] 与 [3] 等)。如果当前元素大于下一个元素,我们交换它们,然后移动到下一个元素。如果没有,让他们保持原样,继续前进
  • 因此,在第一次遍历元素后,最大值 (167) 保证在最后一个单元格中。
  • 现在我们将再次遍历所有元素,但这次我们将从倒数第二个元素的索引 [0] 开始(最大的数字已经在其位置)并进行相同的比较和交换。在这一步之后,在倒数第二个单元格中,我们将获得第二大值 (99)。
  • 重复此过程的次数与我们有数组元素的次数一样多。
我们有主意了。现在我们只需要编写代码。它看起来像这样: Arrays 类及其使用 - 2
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
呃……看起来有点复杂-_- 就算大体原理看得懂,我们还是要写相当多的代码来解决这么简单的任务。好吧,也许我们只是高估了自己?我们已经解决的任务对我们来说可能仍然太复杂了。让我们尝试一些更简单的事情。例如,取相同的数字数组。
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
我们的任务是将其内容复制到另一个数组。
int [] numbersCopy = new int[10];
想想你将如何使用你已经了解的数组来做到这一点?例如,您可以循环遍历numbers数组,然后将其元素顺序写入numbersCopy
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
嗯,嗯,到这里我们基本上就完成了!看来我们已经解决了问题。但是,如果您需要经常这样做,您的代码就会有一堆相同的循环。事实上,这些(和其他)任务早已被 Java 的创建者解决了。我们不需要“重新发明轮子”并编写我们自己的解决方案。有一个特殊的静态类 ( Arrays ) 可以帮助您在使用数组时执行常见任务。此类中添加了用于执行 Java 程序员面临的最常见任务的方法。例如,我们试图处理的数组排序任务在一行中就解决了:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Arrays.sort ()方法对数组进行排序。而且它的算法比我们写的代码效率高很多。控制台输出: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] 注意:要将数组转换为字符串,我们使用了Arrays类的另一个方法:Arrays.toString() . Java 中的数组不会自行覆盖toString()方法。所以,如果你只是写
System.out.println(numbers.toString());
将调用 Object 类的toString() 。对于一个数组,输出将是这样的: [I@4554617c 我们现在不会详细说明为什么这是输出。最主要的是,这显然不是我们所需要的。但是Arrays.toString()正是我们想要的。顺便说一句,使用Arrays类也可以轻松完成复制:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
我们将原始数组(我们要从中复制值)和要将数据复制到其中的新数组的长度 传递给Arrays.copyOf()方法。在这种情况下,我们将numbers.length指定为长度,因为要复制整个数组。如果我们只想复制前几个元素,我们可以指定一个新的较小数组的长度:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
这里我们指定 4 作为新数组的长度。因此,只有 numbers 的前 4 个元素将被复制到新数组中。控制台输出: [167, -2, 16, 99] 顺便说一下,Arrays还允许您从数组的中间而不是数组的开头复制数组的一部分:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
输出: [16, 99, 26, 92] 数字从第二个数组的第二个(含)到第六个(不含)元素复制到新数组中。我们可能还需要比较两个数组。与toString()方法一样,数组本身不会覆盖equals()方法。所以如果我们尝试像这样比较它们
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
然后我们得到假。这是因为将调用比较引用的Object.equals() 。而且,很明显,它们是不同的!但我们需要的是比较数组内容,而不是引用。Arrays类重写了equals()方法,使其完全按照我们的要求执行
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
输出: true 顺便说一下,Arrays类不仅适用于普通数组,还适用于二维数组:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
输出: 这些二维数组是否相等?true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 如您所见,Arrays.copyOf()方法能够复制二维数组。并且该类具有用于比较和显示二维数组的特殊方法:deepEqualsdeepToString()。将来,您会反复看到(并为之欢欣鼓舞)Java 的创造者预料到了程序员经常遇到的许多情况,并用该语言为他们实现了现成的解决方案。使用这些解决方案比重新发明轮子更容易、更方便,对吧?:) 请务必阅读Oracle网站上 Arrays 类的文档。祝你学业顺利!
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论