“Rishi,我真的很期待了解 Arrays 类的其余方法。

“这样的学习热情不能不让你的老老师高兴!但是,如果你真的想知道一切,一个名叫谷歌的好心向导会日以继夜地帮助你。”

“呃……”

“开个玩笑。有点。当然,我会更好地解释一切,但如果有任何事情发生 - 记住好巫师。我将以方法开始今天的Arrays.fill课程

“在处理数组时,Java 程序员经常需要用相同的值填充数组。当然,您可以编写一个循环,并简单地为循环中数组的每个单元格分配一些值:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

“或者您可以调用该方法来代替所有这些Arrays.fill(),它做完全相同的事情:它用传递的值填充传递的数组。这是它的样子:

Arrays.fill(name, value)

上面例子中的代码可以做得更紧凑和更清晰一点:

int[] x = new int[100];
Arrays.fill(x, 999);

“美丽的!”

“您也可以使用该Arrays.fill()方法来填充不是整个数组,而是其中的一部分,具有一些值:

Arrays.fill(name, first, last, value)

第一个最后一个是要填充的第一个和最后一个单元格的索引。

"按照 Java 好的(或坏的)旧传统,请记住最后一个元素不包含在范围内。

例子:

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

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

我们正在用值x[3]x[4]x[5]和填充单元格。数组的单元格从零开始编号! 变量包含值x[6]999

str
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

“该Arrays.fill()方法仅适用于一维数组。如果将二维数组传递给该方法,它将被视为一维数组,并产生所有随之而来的后果。

Arrays.copyOf()

“兄弟,请问数组创建后如何改变数组的大小?”

“嗯……这是个骗人的问题,对吧?我又不是那么没经验了。正确答案是你不能!数组创建后不能调整大小。”

“但如果你真的想要呢?”

“还是不可能!

“实际上,如果你真的想,那么你可以!借助编程技巧:

  1. 首先,您创建一个所需长度的新数组
  2. 然后将第一个数组中的所有元素复制到其中。

“这些是该方法所做的两件事Arrays.copyOf()。这就是调用它的样子:

Type[] name2 = Arrays.copyOf(name, length);

“这个方法并没有改变现有的数组,而是创建了一个新数组,并将旧数组的元素复制到其中。”

“如果新数组的长度小于现有数组的长度怎么办?

“好问题,阿米戈!如果元素不适合,那么多余的值就会被忽略。”

“相反,如果有额外的细胞,它们的初始值是多少?

“如果新数组的长度大于旧数组的长度,则单元格用零填充。

例子:

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

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


变量str2包含值 变量包含值
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

“如果你想从一个长度为 10 的数组中得到一个长度为 5 的数组,但你需要它包含最后 5 个元素而不是前 5 个元素怎么办?在这种情况下,你需要该类的另一个方法。它ArraysArrays.copyOfRange().这就是调用它的样子:

Type[] name2 = Arrays.copyOfRange(name, first, last);

“此方法还创建了一个新数组,但用原始数组中任意位置的元素填充它。firstlast应该放入新数组的第一个和最后一个元素的索引。你能告诉我是否最后一个元素包含在这个范围内吗?”

“哈!正如我伟大的老师曾经说过的那样,‘根据 Java 好的(或坏的)古老传统,记住最后一个元素不包含在范围内’。”

“朋友,你正在我们眼前成长。

例子:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


变量str2包含值 变量包含值
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

“最后,我把最……嗯……令人愉快的方法留到最后:排序。数组在编程中经常被排序。以下是使用数组时最常用的前 3 个操作:

  • 排序数组
  • 查找数组的最小(或最大)元素
  • 确定数组中元素的索引(查找数组中的元素)

“我必须说,性能良好的排序算法并不那么容易编写。更准确地说,这是一项标准任务,作为一名学生,有时练习编写排序算法不会对你造成伤害。但在工作中,它是最好不要浪费时间重新发明轮子。Java 的创建者sort()Arrays类中包含了该方法。这就是调用它的样子:

Arrays.sort(name);

此方法按升序对传递的数组进行排序。

例子:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


变量str包含值
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

“太棒了!我只调用了一个方法,数组就排序了。真是太棒了!”

“顺便说一下,你不仅可以对整个数组进行排序,还可以只对其中的一部分进行排序。这就是调用它的样子:

Arrays.sort(name, first, last);

第一个最后一个是排序应该接触的第一个和最后一个单元格的索引。并且......

“我已经知道你要说什么了!‘按照 Java 好的(或坏的)老传统,记住最后一个元素不包含在范围内’

例子:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


变量str包含值
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

“为了对数组进行排序,Java 使用了最快的排序算法——QuickSort 其计算复杂度取决于数组的大小,并使用公式 N log(N) 进行计算。

“对 1000 个元素的数组进行排序将涉及大约 10,000 次数组元素比较。对 100 万个元素的数组进行排序将涉及大约 2000 万次比较。”

考虑到元素的数量,就不用过多比较了!”

“这正是我要说的。QuickSort算法非常高效。

Arrays.binarySearch()

“好吧,这个类的最后一个最有趣的方法Arrays是能够在数组中搜索给定的值。这不是普通的搜索——它是深受喜爱的二进制搜索。它归结为:

  • 首先,对数组进行排序。
  • 然后将数组的中间元素与我们要查找的元素进行比较。
  • 如果该元素大于中间元素,则在数组的右半部分继续搜索。
  • 如果我们要查找的元素小于中间元素,则在数组的左半部分继续查找。

“因为数组是排序好的,一次比较就可以淘汰掉一半,那么下一步,我们再折腾掉一半,以此类推。”

“太棒了!我们很快就直奔目标了!”

“没错。在一百万(!)个元素的数组中,二分查找算法只需比较 20 次就可以找到所需元素的索引。该算法的缺点是必须先对数组进行排序,排序也需要时间。

这就是调用它的样子:

int index = Arrays.binarySearch(name, value);

"wherename是数组的名字,必须传入已经排序好的(比如使用方法Arrays.sort())。并且value是我们要在数组中查找的元素。方法返回的结果就是要查找的数组元素的索引.

例子:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
x
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(指数02也是可以接受的)
8
-7

“如果所需元素在数组中出现多次怎么办?”

“这是一个有效的问题,阿米戈。在这种情况下,算法将返回其中一个的索引(不能保证它会是,比如说,第一个,反之亦然——这些重复元素中的最后一个) ”

“如果数组根本不包含所需的元素怎么办?”

“在这种情况下,算法将返回一个负数索引

文档

“一切都清楚了,Rishi!这很有趣。”

“如果您真的觉得这很有趣,那么请在闲暇时浏览一下Oracle 网站Arrays上该类及其方法的官方文档。

“你可以仔细看看,例如,Arrays.mismatch()Arrays.compare()方法。你很可能能够很好地利用它们。

“不要被方法的数量搞糊涂了。每个方法都有 5-10 种变体,它们仅在参数类型上有所不同。”