[英]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在內部使用哈希映射,並且哈希映射不能保證順序會隨着時間的推移保持恆定。
如果您對Java中任何類的內部工作感到好奇,請在jdk安裝文件夾下找到src zip文件並查看內部。
HashSet可能只是一個數組,並使用哈希函數來指示將值插入哪個存儲桶。 它保證唯一性,但不保證任何順序。
如果您需要該集合具有插入順序 ( for
與插入數字相同的順序for
迭代),請使用LinkedHashSet
。 當您在插入越來越多的數字時不需要保持集合的排序時, TreeSet
會顯得過分TreeSet
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.