你好!通过过去的几节课,我们在掌握ArrayList方面取得了很大的进步。然而,这段时间我们只进行了最简单的操作:删除、插入、输出到控制台。当然,这并不是开发人员在使用ArrayList时面临的一系列问题的结束。还记得有关数组和Arrays类的讲座吗?它是由 Java 的创建者专门开发的,旨在解决程序员在使用数组时遇到的常见问题。ArrayList怎么样?当然,他也有一些典型任务清单。它们都是在某个单独的类中实现的,还是我们每次都必须手动编写所需的行为?当然,您不需要自己编写所有内容。在 Java 中使用集合时执行的最常见操作已在特殊的静态类 Collections 中实现。
Java 中的集合
“集合”是Java中几种数据结构的通用名称。数据可以以多种不同的方式存储。到目前为止,我们只研究了ArrayList 类,其中数据存储在数组中。稍后我们将熟悉其余的集合。现在只要了解 Collections 类的设计不仅可以与 ArrayList 一起使用,还可以与 Java 中的其他类型的集合一起使用(实际上,它的名字也因此而来)。那么,在使用 ArrayList 时,Collections 类可以帮助您解决哪些任务?第一个也是最明显的是排序。在数组讲座中,我们看了一个数字示例,现在让我们看一个字符串示例。为了对集合的内容进行排序,Collections 类实现了以下方法sort()
:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
System.out.println(solarSystem);
}
}
结论:
[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
这些行已按字母顺序排序!为什么按字母顺序排列?该类String
被编程为准确确定字符串之间的比较方式(精确地按字母顺序)。对于您自己创建的类,您可以实现自己的比较机制,但我们将在其他讲座中讨论这一点。此外,Collections 类允许您查找 中的最小和最大元素ArrayList
。这是使用min()
和方法完成的max()
:
public static void main(java.lang.String[] args) {
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
System.out.println(Collections.max(numbers));
System.out.println(Collections.min(numbers));
}
结论:
7
1
当然,这比手动编写代码遍历所有元素并搜索最大/最小元素要方便得多:) 另一种非常有用的方法是reverse()
. 如果我们需要“反转”一个列表,使元素处于相反的顺序,我们会怎么做?自己编写这样的算法可能并不那么容易:)幸运的是,该方法reverse()
已经知道如何做到这一点。例如,我们不喜欢该方法如何sort()
按字母顺序对行星进行排序,并且我们希望将顺序更改为相反的顺序 - 从 Z 到 A:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
Collections.reverse(solarSystem);
System.out.println(solarSystem);
}
}
结论:
[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
顺便说一句,这里我们经常谈论排序、元素顺序等。如果我们的任务正好相反怎么办?例如,我们正在尝试实施抽奖机制。我们已向卷轴添加了 100 个数字,这些数字应一次出现在屏幕上。第一个划掉彩票上所有数字的参与者获胜。使用以下方法实现这样的机制非常容易shuffle()
:
public class Main {
public static void main(java.lang.String[] args) {
ArrayList<Integer> lottery = new ArrayList<>(100);
for (int i = 1; i <= 100; i++) {
lottery.add(i);//add numbers from 1 to 100 to the drum
}
Collections.shuffle(lottery);//mix
System.out.println("Attention! The first 10 numbers appear from the drum!");
for (int i = 0; i < 10; i++) {
System.out.println(lottery.get(i));
}
}
}
结论:
Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
就这么简单!问题解决了,我们的游戏部分也写好了:) 现在让我们想象一下不同的情况。之前,我们创建了一个列表solarSystem
,其中列出了行星。它似乎适合我们所有人,如果不是为了一件事:您可以从中删除元素并添加新元素!这显然不是我们期望的行为:我们程序中的太阳系应该处于不变的状态。Collections 类有一个非常有趣的方法 - unmodifiableList()
. 它创建给定列表的不可变版本。不可能向其中添加或删除元素。就太阳系行星列表而言,这正是我们所需要的!
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune)));
solarSystem.add("Pluto");//try to add a new element
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
at Main.main(Main.java:21)
错误:solarSystem
现在您无法添加任何内容!在这种情况下,您唯一需要注意的是变量的类型必须是List<>
, 而不是ArrayList<>
(此方法返回正是这种类型的对象,对于所有类型的列表都是通用的)。工作中可能发生的另一种常见情况是程序员以错误的顺序添加了元素。如果发生这种情况,并且水星和海王星意外地改变了位置,以下方法将帮助我们纠正这个错误swap()
:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
, jupiter, saturn, uranus, mercury));// wrong planet order
System.out.println(solarSystem);
Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
System.out.println(solarSystem);
}
}
swap()
我们将列表以及需要交换的两个元素的索引传递 给方法。请注意:该方法专门适用于索引,而不适用于链接。因此,这里我们需要一个方法ArrayList.indexOf()
。结论:
[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]
[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
最后我们来认识一下一个非常有趣的方法—— disjoint()
。它检查两个集合是否有交集,即至少有一个相同的元素。如果不是,则返回true
,如果是,则返回false
。
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));
System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));
}
}
正如您所看到的,我们的两个列表中的元素完全不同,因此程序输出true
。这是一门非常有趣且非常有用的课程。比如Arrays
,他为我们做了很多日常的、琐碎的工作,让我们能够专注于其他事情。请阅读Oracle文档,那里还有其他方法。
GO TO FULL VERSION