HashSet如何排序?

时间:2014-04-17 17:58:01

标签: java arraylist hashset

我正在为几周的编程考试而练习。其中一个较小的任务是请求用户输入(链接)并将其添加到唯一列表(集)。

这就是我做的方式(并且有效):

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)但是当我添加数字时,它们已经被排序了,为什么它们没有排序?我已经多次这样做了,而且每次他们都没有排序,而且完全一样。每一次。

5 个答案:

答案 0 :(得分:3)

  

那为什么我的假设是错误的?我只是好奇。有可能   因为我的代码很糟糕,我不知道,这就是我在这里问的原因。

Set不是已排序的数据结构。没有更多的东西:)

但是,Set实现具有排序机制。例如,treeset


回答你的编辑:

它们是未分类的,因为内部HashSet使用HashMap,它通过一些散列算法在桶中分配条目。这些桶在某些订单中检查,但不保证保持不变。

答案 1 :(得分:1)

您的HashSet按未排序的顺序排列,因为每个条目hashed都放在bucket中。对于SortedSet(不使用HashSet),您可以使用TreeSet

答案 2 :(得分:1)

HashSet内部使用hash-map,而hash-map不保证订单会随着时间的推移保持不变。

如果您对Java中任何类的内部工作感到好奇,那么在jdk安装文件夹下找到src zip文件并查看内部。

答案 3 :(得分:0)

HashSet可能只是一个数组,并使用散列函数来指示将值插入哪个存储桶。它保证了唯一性,但不保证任何订单。

答案 4 :(得分:0)

如果您需要设置插入顺序for以与插入数字相同的顺序进行迭代),请使用LinkedHashSet。当您在插入越来越多的数字时,不需要保持设置排序TreeSet会有点过分。