我正在为几周的编程考试而练习。其中一个较小的任务是请求用户输入(链接)并将其添加到唯一列表(集)。
这就是我做的方式(并且有效):
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)但是当我添加数字时,它们已经被排序了,为什么它们没有排序?我已经多次这样做了,而且每次他们都没有排序,而且完全一样。每一次。
答案 0 :(得分:3)
那为什么我的假设是错误的?我只是好奇。有可能 因为我的代码很糟糕,我不知道,这就是我在这里问的原因。
Set不是已排序的数据结构。没有更多的东西:)
但是,Set实现具有排序机制。例如,treeset。
回答你的编辑:
它们是未分类的,因为内部HashSet使用HashMap,它通过一些散列算法在桶中分配条目。这些桶在某些订单中检查,但不保证保持不变。
答案 1 :(得分:1)
答案 2 :(得分:1)
HashSet内部使用hash-map,而hash-map不保证订单会随着时间的推移保持不变。
如果您对Java中任何类的内部工作感到好奇,那么在jdk安装文件夹下找到src zip文件并查看内部。
答案 3 :(得分:0)
HashSet可能只是一个数组,并使用散列函数来指示将值插入哪个存储桶。它保证了唯一性,但不保证任何订单。
答案 4 :(得分:0)
如果您需要设置插入顺序(for
以与插入数字相同的顺序进行迭代),请使用LinkedHashSet
。当您在插入越来越多的数字时,不需要保持设置排序,TreeSet
会有点过分。