簡體   English   中英

HashSet如何排序?

[英]How does HashSet sort?

我正在為幾周后的編程考試做練習。 較小的任務之一是要求用戶輸入(鏈接)並將其添加到唯一列表(集合)。

這是我做到的方式(而且有效):

DefaulListModel m = new DefaulListModel();
JList aList = new JList(m);
ArrayList<String> lenker = new ArrayList<String>();
Set<String> unique;

(...)

String url = JOptionPane.showInputDialog(null, "Skriv inn URL");
lenker.add(url);
unique = new HashSet<String>(lenker);
this.oppdaterGUI(liste, unique);

(...)

public void oppdaterGUI(JList liste, Set<String> array){
    m.clear();
    for(Object s : array){
        m.addElement((String) s);
    aList.setModel(m)
}

這是我的問題:測試時,我輸入了數字1,2,3,4,5,1

現在,我假設ArrayList包含數字[1,5,4,3,2,1]並且我假設在將其添加到HashSet之后,它看起來應該像{5,4,3,2,1}

但是,它看起來像這樣:{3,2,1,5,4}

為什么我的假設是錯誤的?

編輯:澄清。 我知道HashSet沒有排序(即TreeSet),但是當我添加數字時,它們已經排序了,為什么它們不排序就出來? 我已經做過多次了,每次它們以未分類的方式完全一樣地出現。 每一次。

那我的假設為什么錯了? 我只是好奇。 可能是因為我的代碼很爛,我不知道,這就是為什么我在這里詢問。

Set不是排序的數據結構。 僅此而已:)

但是,有具有排序機制的Set實現。 例如, treeset


回答您的編輯:

它們之所以沒有排序,是因為HashSet在內部使用了HashMap,它通過某種哈希算法將條目分配到存儲桶中。 那些存儲桶以某種順序檢查,因此不能保證保持不變。

您的HashSet以未排序的順序出現,因為每個條目都經過哈希處理以放入存儲桶中 對於SortedSet (不是HashSet),可以使用TreeSet

HashSet在內部使用哈希映射,並且哈希映射不能保證順序會隨着時間的推移保持恆定。

如果您對Java中任何類的內部工作感到好奇,請在jdk安裝文件夾下找到src zip文件並查看內部。

HashSet可能只是一個數組,並使用哈希函數來指示將值插入哪個存儲桶。 它保證唯一性,但不保證任何順序。

如果您需要該集合具有插入順序for與插入數字相同的順序for迭代),請使用LinkedHashSet 當您在插入越來越多的數字時不需要保持集合的排序時, TreeSet會顯得過分TreeSet

暫無
暫無

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

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