【问题标题】:Multiple for loop on Java Set [duplicate]Java Set上的多个for循环[重复]
【发布时间】:2013-02-19 16:56:42
【问题描述】:

我有一个带有值的 Map 并使用 Map.keySet 方法获取一个 Set。 在这段代码中:

Map<String, String> map = new HashMap<>(); 
map.put("1", "a"); 
map.put("2", "b"); 
map.put("3", "c"); 
Set<String> set = map.keySet();

for (int i = 0; i < 5; i++) {
    for (String key : set) {
        System.out.println(key);
    } 
}

我保证得到

1
2
3

每次都写出来?这个保证写在哪里?在 Javadoc 中?

编辑:实际上我并不关心插入顺序,但我关心这样一个事实,即在集合上使用 for-each 循环会一遍又一遍地产生相同的结果,前提是不重复的映射不会改变(我不要调用 put,remove)。

【问题讨论】:

  • 你是否执行了代码。您的代码是否正在编译并产生预期的输出?
  • 不是重复的。请阅读我的问题中的编辑

标签: java map set


【解决方案1】:

不,您不能保证特定的顺序,除非您使用实现了自定义 set 的 HashMap,它可以为您提供这种保证。 Set HashMap 为您提供了一个 Iterator() 方法,该方法以“no specific order”迭代元素。

阅读java文档:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Set.html#iterator()

如果你想保证元素在in-order上迭代,即升序,使用实现SortedMap的东西,比如TreeMap .

TreeMap 文档:http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

在此页面上,您可以找到 getSet() 方法,该方法显示“集合的迭代器按升序返回键”。

【讨论】:

  • 再一次,我不想要任何特定的顺序,我只希望结果在 for-each 循环的多次调用中是相同的
  • 如果你循环一次,你会得到你写的命令。但是,如果您向 HashMap 添加一个元素,然后再次循环遍历它,您可能会在循环中的其他元素之间获得该元素。它与 .hashcode() 方法有关。您无法确定新元素是否已放入 HashMap
  • 你是对的,但我知道底层地图何时何地改变。这是我的代码。
  • 那没问题,如果你知道你会得到什么输出。
【解决方案2】:

如果您想按照放置键的顺序检索,请使用LinkedHashMap

【讨论】:

    【解决方案3】:

    不幸的是,HashMap 的文档指出keySet() 方法不返回SortedSet,它只返回Set,不能保证其顺序。

    HashMap.keySet()

    阅读,特别是:它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

    【讨论】:

      【解决方案4】:

      LinkedHashMap 用于添加顺序(放置),TreeMap(接口 SortedMap)用于键顺序。

      【讨论】:

      • 我只是在想,在 for-each 循环中重用集合对象将提供相同的结果,但我发现集合仍然由地图支持。所以改变地图也会改变集合。
      【解决方案5】:

      不,你不是。但是您可以使用LinkedHashMap (http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html) 就可以得到保证。

      【讨论】:

        猜你喜欢
        • 2013-06-11
        • 2014-01-12
        • 2017-04-03
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 2021-11-06
        相关资源
        最近更新 更多