如何从迭代器()中以正确的顺序获取元素

Posted

技术标签:

【中文标题】如何从迭代器()中以正确的顺序获取元素【英文标题】:How to get the elements in correct order from iterator() 【发布时间】:2011-10-23 04:43:02 【问题描述】:

这是我将数据存储到 HashMap 并使用迭代器显示数据的代码

public static void main(String args[]) 
    HashMap<String, String> hm = new HashMap<String, String>();
    hm.put("aaa", "111");
    hm.put("bbb", "222");
    hm.put("ccc", "333");
    hm.put("ddd", "444");
    hm.put("eee", "555");
    hm.put("fff", "666");

    Iterator iterator = hm.keySet().iterator();

    while (iterator.hasNext()) 
        String key = (String) iterator.next();
        String val = hm.get(key);

        System.out.println(key + " " + val);
    

但它没有按照我存储的顺序显示。有人可以告诉我我哪里出错了吗?如何获取订单中的元素?

【问题讨论】:

【参考方案1】:

HashMap 没有保证顺序:

这个类不保证地图的顺序;

使用LinkedHashMap。

Map接口的哈希表和链表实现,迭代顺序可预测。

【讨论】:

【参考方案2】:

您需要使用LinkedHashMap,因为它维护其条目的顺序,这与 HashMap 不同。

来自 javadocs:

...可预测的迭代顺序实现 Map 接口。此实现不同于 HashMap,因为它维护一个双向链表,贯穿所有 其条目。这个链表定义了迭代顺序,它 通常是键插入映射的顺序 (插入顺序)。

【讨论】:

【参考方案3】:

HashMap不保持我们放入数据的顺序,所以你可以改用LinkedHashMap,它保持我们放入数据的顺序。LinkedHashMap可以和HashMap一样使用。

Map<key,value> map=new LinkedHashMap<key,value>();
map.put("key","value");
map.put("key","value");
map.put("key","value");

//同样你也可以使用迭代器来访问数据。它会按照你添加的顺序显示dfata。

【讨论】:

重复???我从不复制一次答案。我知道我发布了。这并不意味着我知道没人知道吗?三思而后行。 看看别人提供的答案。他们已经解释过HashMap 不保持秩序,并建议使用LinkedHashMap 作为替代方案。您的回答仅提供了已经提供的内容。它实际上提供的更少,因为您甚至没有链接到 javadocs。我确实考虑了否决票,我什至确保我没有匿名投票 - 不客气。 每个问题都有一个相似的答案,如果有多个答案,则都表示相似的答案。这并不意味着我们复制了。因此,每个问题通常都会得到多个答案,并且所有答案都相同无论如何意思。为什么你只看我的答案。我的答案比其他人有更多的描述。 您的回答没有更多的描述性,它只是有更多的词。你说的其他一切都是不正确的。如果一个问题已经得到充分回答,大多数人会投票并避免提供自己的答案。如果他们有什么要补充的,他们通常会在评论中添加他们的花絮。 @mre 他的回答比其他人晚了 3 分钟。他可能花了 3 分钟以上的时间来写它。【参考方案4】:

原因是 HashMap 和 HashSet 不保证存储值的顺序。元素的位置将取决于内部表的大小和键的 hashCode。

如果您想按某种顺序加载数据,则需要对键/值进行排序。例如,您可以将条目集合 (Map.entrySet()) 放到列表中,并按您想要的任何标准进行排序。或者您可以使用 SortedMap(例如 TreeMap)来存储您的对象。

【讨论】:

以上是关于如何从迭代器()中以正确的顺序获取元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 即时窗口中获取迭代器的元素值? *迭代器不起作用[关闭]

在迭代期间可以变异的可迭代集合

顺序容器(迭代器)--C++复习

python -- 迭代器

For 循环集合 - 获取下一个元素迭代器

迭代器模式-Iterator