“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 好的(或坏的)旧传统,请记住最后一个元素不包含在范围内。
例子:
|
我们正在用值 x[3] 、x[4] 、x[5] 和填充单元格。数组的单元格从零开始编号! 变量包含值x[6] 999 str "[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]" |
“该Arrays.fill()
方法仅适用于一维数组。如果将二维数组传递给该方法,它将被视为一维数组,并产生所有随之而来的后果。
Arrays.copyOf()
“兄弟,请问数组创建后如何改变数组的大小?”
“嗯……这是个骗人的问题,对吧?我又不是那么没经验了。正确答案是你不能!数组创建后不能调整大小。”
“但如果你真的想要呢?”
“还是不可能!
“实际上,如果你真的想,那么你可以!借助编程技巧:
- 首先,您创建一个所需长度的新数组
- 然后将第一个数组中的所有元素复制到其中。
“这些是该方法所做的两件事Arrays.copyOf()
。这就是调用它的样子:
Type[] name2 = Arrays.copyOf(name, length);
“这个方法并没有改变现有的数组,而是创建了一个新数组,并将旧数组的元素复制到其中。”
“如果新数组的长度小于现有数组的长度怎么办?
“好问题,阿米戈!如果元素不适合,那么多余的值就会被忽略。”
“相反,如果有额外的细胞,它们的初始值是多少?
“如果新数组的长度大于旧数组的长度,则单元格用零填充。
例子:
|
变量 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 个元素怎么办?在这种情况下,你需要该类的另一个方法。它Arrays
是Arrays.copyOfRange()
.这就是调用它的样子:
Type[] name2 = Arrays.copyOfRange(name, first, last);
“此方法还创建了一个新数组,但用原始数组中任意位置的元素填充它。first和last是应该放入新数组的第一个和最后一个元素的索引。你能告诉我是否最后一个元素包含在这个范围内吗?”
“哈!正如我伟大的老师曾经说过的那样,‘根据 Java 好的(或坏的)古老传统,记住最后一个元素不包含在范围内’。”
“朋友,你正在我们眼前成长。
例子:
|
变量 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);
此方法按升序对传递的数组进行排序。
例子:
|
变量 str 包含值"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]" |
“太棒了!我只调用了一个方法,数组就排序了。真是太棒了!”
“顺便说一下,你不仅可以对整个数组进行排序,还可以只对其中的一部分进行排序。这就是调用它的样子:
Arrays.sort(name, first, last);
“第一个和最后一个是排序应该接触的第一个和最后一个单元格的索引。并且......
“我已经知道你要说什么了!‘按照 Java 好的(或坏的)老传统,记住最后一个元素不包含在范围内’。
例子:
|
变量 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
是我们要在数组中查找的元素。方法返回的结果就是要查找的数组元素的索引.
例子:
|
x 是{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999} 4 1 (指数0 和2 也是可以接受的)8 -7 |
“如果所需元素在数组中出现多次怎么办?”
“这是一个有效的问题,阿米戈。在这种情况下,算法将返回其中一个的索引(不能保证它会是,比如说,第一个,反之亦然——这些重复元素中的最后一个) ”
“如果数组根本不包含所需的元素怎么办?”
“在这种情况下,算法将返回一个负数索引。
文档
“一切都清楚了,Rishi!这很有趣。”
“如果您真的觉得这很有趣,那么请在闲暇时浏览一下Oracle 网站Arrays
上该类及其方法的官方文档。
“你可以仔细看看,例如,Arrays.mismatch()
和Arrays.compare()
方法。你很可能能够很好地利用它们。
“不要被方法的数量搞糊涂了。每个方法都有 5-10 种变体,它们仅在参数类型上有所不同。”
GO TO FULL VERSION