【问题标题】:Why is data.entrySet().iterator() ordered in a different order, compared to the HashMap<Long, String> data?与 HashMap<Long, String> 数据相比,为什么 data.entrySet().iterator() 的排序顺序不同?
【发布时间】:2014-03-13 11:50:30
【问题描述】:

我有存储在HashMap&lt;Long, String&gt; 中的输入数据(时间戳、Json 字符串)。为了处理 JSON 字符串,我使用了一个迭代器。

我使用Iterator&lt;Entry&lt;Long, String&gt;&gt; it = data.entrySet().iterator(); 来获取entrySet 作为迭代器。

我现在的问题是 HashMap 的组织方式如下:

 123,{String1} 
 124,{String2} 
 125,{String3}

更好的表达方式:我在HashMap中添加A,在HashMap中添加Z,在HashMap中添加E,在HashMap中添加I。我希望 A、Z、E 和 I 的顺序在迭代器中具有相同的顺序。

如果我把它放在一个迭代器中,我会得到:

124, {String2}
123, {String1}
125, {String3}

迭代器的顺序与HashMap的顺序不同。对我来说,迭代器的顺序必须与 HashMap 的顺序完全相同。我做错了什么,迭代器正在改变数据的顺序?

【问题讨论】:

  • (如果你想要的是插入顺序,而不是自然排序顺序,那就是LinkedHashMap。)
  • 哈希映射没有排序...您的哈希映射没有像任何东西一样“组织”!如果要对数据集进行排序,请使用 TreeMap
  • 也许我表达错了。这不是关于排序,而是关于顺序。我把A放到HashMap,B放到HashMap,Z放到HashMap,D放到HashMap。使用调试器,我看到了 A、B、Z、D 的顺序,我希望迭代器中的顺序相同。

标签: java json iterator hashmap


【解决方案1】:

HashMap 没有按任何特定顺序组织,或者更准确地说,不能保证顺序。如果您需要有序映射,请使用 SortedMapTreeMap 实现,如果您需要覆盖键的默认顺序,则提供 Comparator

【讨论】:

    【解决方案2】:

    除上述发现外,
    即使您可以使用下面给出的 LinkedHashMapLinkedHashMap 也会确保值按插入顺序存储。

    public static void main(String[] args) {
        Map<Integer, String> map = new LinkedHashMap<Integer, String>();
        Map<Integer, String> map2 = new HashMap<Integer, String>();
        map.put(1, "oneone");
        map.put(3, "twoone");
        map.put(2, "threeone");
        map2.put(1, "oneone");
        map2.put(3, "twoone");
        map2.put(2, "threeone");
        for(Entry<Integer, String> entry:map.entrySet()){
            System.out.println(entry.getKey());
    
        }
    
        for(Entry<Integer, String> entry:map2.entrySet()){
            System.out.println(entry.getKey());
    
        }
    
    }
    

    这里的结果将是,

    1
    3
    2
    1
    2
    3

    【讨论】:

    • 如果对您有帮助,请将答案标记为正确。 :)
    【解决方案3】:

    HashMap 文档说

    这个类不保证地图的顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。

    因此,在迭代视图 entrySetkeySetvalues 时不应依赖顺序。

    Map 的一些实现如TreeMap 提供了@Oleg S 和@Smutje 已经建议的排序保证。

    【讨论】:

    • 抄袭其他答案?
    • @OlegS。你不能假设那是因为我抄袭什么的。 stackoverflow 的所有用户都会多次编辑答案,以使答案更加完整和完整。你我碰巧有相同的答案不代表我抄袭了。
    • 我认为这是相当并发的写作。 ;-)
    • @OlegS。无论如何,我还在我的帖子中添加了对这两个答案的引用,这只是为了显示unwilling 我是如何复制的。您不应该对相同的答案如此挑剔。你会发现一些问题,每个人都有相同的答案。都是互相抄袭的??不,这不是社区的运作方式。每个人都有平等的机会代表他们的答案。由于相对较新,您很快就会发现。
    • 在其他两个发布后,您很好地编辑了您的答案,首先添加了有关 TreeMap 和 SortedMap 的信息,因此它与大致同时提出原始想法无关。跨度>
    【解决方案4】:

    摘自java.util.Map API 文档:“Map 接口提供了三个集合视图,允许将映射的内容视为一组键、值集合或键值映射集。地图被定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,如 TreeMap 类,对它们的顺序做出具体保证;而另一些,如 HashMap 类,则没有。"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多