你好!透過過去的幾堂課,我們在掌握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