簡體   English   中英

如何在HashSet中保留插入順序?

[英]How can I preserve insertion order in a HashSet?

我寫了下面的代碼,

public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for (int num : nums) {
    num_set.add(num);
    System.out.println("num_set: " + num_set.toString());
}

然后我有測試用例,

int[] nums  = {100, 4, 200, 1, 3, 2};

然后在最后一行輸出中,控制台顯示,

num_set: [1, 2, 3, 100, 4, 200]

我想知道為什么添加操作后更改了先前的順序。

說明HashSet文檔

保證集合的迭代順序。 特別是,它不能保證順序會隨着時間的推移 保持恆定。

如果要使用保持自然順序的Set ,請改用SortedSet

一個Set,進一步提供其元素的總體排序。 元素使用其自然順序或通過通常在排序集創建時提供的Comparator進行排序。

編輯: Set確實沒有說出有關其元素順序的任何信息。 例如,如果兩個Set包含相同的元素並且具有相同的大小,則兩個Set相等。 Set的迭代順序取決於實現,並且在版本之間可能會發生變化,因此您不應對此做任何假設。 它可能取決於#hashCode的值,但也可能取決於插入順序或將來的其他操作。 但是,我們不在乎,因為如果您這樣做,則應改用ListSortedSet

格蘭仕已經回答了您的問題。 我仍然想補充一點:Java庫中有一些接口可以為開發人員提供合同 ,並保證可以以哪種方式使用它們。

就像您的問題一樣,基本界面設置

不包含重復元素的集合。

而你的implementor 的HashSet ,已經明確規定的事實, 次序不能保證,在這種情況下,你不能指望任何與訂單相關的承諾。

保證集合的迭代順序 特別是,它不能保證順序會隨着時間的推移保持恆定。

具體來說,Java提供了另一個接口SortedSet來確保您要求的順序

一個Set,進一步提供其元素的總體排序。 元素使用其自然順序或通過通常在排序集創建時提供的Comparator進行排序。

因此,在您的情況下,您應該找到implementor SortedSet 接口的實現 ,例如TreeSet

通常,我們不太關心實現細節,因為可以在不知情的情況下對其進行調整/更改 ,而另一方面,將始終遵守官方文檔中庫開發人員所做的承諾

您似乎想保留插入順序。 為此有一個名為LinkedHashSet的類。 以下是一些示例代碼:

int[] nums  = {100, 4, 200, 1, 3, 2};
Set<Integer> ints = new LinkedHashSet<>();
for(int i : nums) {
    ints.add(i);
}
System.out.println(ints);

上面的代碼打印: [100, 4, 200, 1, 3, 2]

文檔所述

Set接口的哈希表和鏈表實現,具有可預測的迭代順序。 此實現與HashSet的不同之處在於,它維護貫穿其所有條目的雙向鏈接列表。 此鏈表定義了迭代順序,即將元素插入集合中的順序(插入順序) 請注意,如果將元素重新插入到集合中,則插入順序不會受到影響。 (如果在s.contains(e)在調用之前即將返回true的情況下調用s.add(e),則將元素e重新插入到set s中。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM