繁体   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