在 Java 中對 HashSet 進行排序
一、概述
HashSet
是java.util
包中的集合類。該類繼承於AbstractSet
類,實現了Set
接口。此外, HashSet
不保留元素的順序,因此需要找到對這些元素進行排序的方法。
在本快速教程中,我們將學習多種技術來對HashSet
的元素進行排序。
2. 使用Collections.sort()
方法
Collections.sort()
方法對實現java.util.List
接口的對象集合進行排序。因此,我們可以將HashSet
轉換為List
,然後使用Collections.sort()
對其進行排序:
HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(2);
numberHashSet.add(1);
numberHashSet.add(4);
numberHashSet.add(3);
// converting HashSet to arraylist
ArrayList arrayList = new ArrayList(numberHashSet);
// sorting the list
Collections.sort(arrayList);
assertThat(arrayList).containsExactly(1, 2, 3, 4);
在上面的示例中,我們首先將HashSet
的元素複製到ArrayList
中。然後,我們使用ArrayList
作為Collections.sort()
方法的參數。除了ArrayList
,我們還可以使用LinkedList
或Vector
。
3. 使用TreeSet
使用這種方法,我們將HashSet
轉換為TreeSet
,它與HashSet
類似,只是它按升序存儲元素。因此,當HashSet
轉換為TreeSet
時, HashSet
元素會按順序排列:
HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(2);
numberHashSet.add(1);
numberHashSet.add(4);
numberHashSet.add(3);
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.addAll(numberHashSet);
assertThat(treeSet).containsExactly(1, 2, 3, 4);
我們可以看到,使用TreeSet
對HashSet
進行排序非常簡單。我們只需要使用HashSet
列表作為參數創建TreeSet
的實例。
4. 使用stream().sorted()
方法
有一種簡潔的方法可以使用 Stream API 的stream().sorted()
方法對HashSet
進行排序。這個在 Java 8 中引入的 API 允許我們對一組元素執行函數操作。此外,它可以從不同的集合中獲取對象並以所需的方式顯示它們,具體取決於我們使用的管道方法。
在我們的示例中,我們將使用**stream().sorted()
方法,該方法返回一個Stream
,其元素按特定順序排序**。需要注意的是,由於原來的HashSet
沒有被修改,所以我們需要將排序的結果保存在一個新的Collection
中。我們將使用collect()
方法將數據存儲回新的HashSet
中:
HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(200);
numberHashSet.add(100);
numberHashSet.add(400);
numberHashSet.add(300);
HashSet<Integer> sortedHashSet = numberHashSet.stream()
.sorted()
.collect(Collectors.toCollection(LinkedHashSet::new));
assertThat(sortedHashSet).containsExactly(100, 200, 300, 400);
我們應該注意,當我們使用stream()
時。沒有參數的sorted()
方法,它按自然順序對HashSet
進行排序.
我們還可以用比較器重載它來定義自定義排序順序。
5.結論
在本文中,我們討論瞭如何使用三種方式在 Java 中對HashSet
進行排序:使用Collections.sort()
方法、使用TreeSet
和使用stream().sorted()
方法。
與往常一樣,代碼片段可在 GitHub 上獲得。