在java中迭代EnumMap更好的是什么?

时间:2015-05-24 09:22:06

标签: java dictionary enums enum-map

假设我已将枚举和相应的emummap声明为:

enum MyEnum {
    CONSTANT1, CONSTANT2, CONSTANT3;
}

EnumMap<MyEnum, String> MyEnumMap = new EnumMap<MyEnum, String>(MyEnum.class);

我想迭代MyEnumMap,例如,逐个打印每个Entry

在以下情况下迭代密钥的最佳方法(最快)是什么:

  1. 确保MyEnum中的每个常量都是MyEnumMap
  2. 中的键
  3. MyEnum中的每个常量可能是MyEnumMap
  4. 中的关键字,也可能不是。{1}} 中的关键字

    我想在使用MyEnumMap.keySet()MyEnum.values()的foreach循环之间进行选择。任何其他方法都是最受欢迎的。

4 个答案:

答案 0 :(得分:2)

没关系。在内部,EnumMapimplemented,其中一对数组的长度与enum条目的数量相同。一个数组具有enum个元素,而第二个数组具有映射到它们的对象,或NULL个占位符。因此,EnumMap上的任何迭代都等同于遍历整个for序列范围的整数索引上的enum循环,因此您应该选择使您的代码对您最具可读性的方法

答案 1 :(得分:1)

如果您查看EnumMap#keySet()

的代码
381  public Set<K> keySet() {
382 Set<K> ks = keySet;
383 if (ks != null)
384 return ks;
385 else
386 return keySet = new KeySet();
387 }

您会注意到它会返回keySet内部使用的EnumMap来存储密钥。

现在每次调用MyEnum.values()时,我们都会得到填充所有枚举元素的不同数组。这意味着创建了第一个空数组,后来需要填充所有需要迭代的枚举。

因此,在第一种方法中,您正在跳过迭代已经由map存储的枚举,而在第二种方法中我们只是创建一些临时数组,这涉及对所有MyEnum元素的额外迭代。

答案 2 :(得分:0)

这取决于您的应用程序逻辑,但这里有一些提示:

表示1)

Sector
 - X
 - Y
Ship
 - ID
 - Name
 - Speed
 - Sector_X
 - Sector_Y
 - Destination_X
 - Destination_Y
 - Sector_X1
 - Sector_X2

for 2)但是使用1)仍然更好,因为你可以获得没有包含在Map中的枚举值的信息。

 // it is a bit faster to iterate over plain array, than over Set
 // And you can also get here information about entries that are in enum, but not in hashMap, so you can have logic for those cases.
 for (MyEnum e: MyEnum.values()) {
     // you can get here information what is contained and not contained in your map
}

答案 3 :(得分:-1)

也许,你只想要另一种编写代码的方式.... 因为键总是唯一的

for(MyEnum myEnum: MyEnum.values()){
        String value = map.get(myEnum);
         If(value != null){ 
             //use the value here
          }
 }

另一种写作方式。

或者您也可以尝试

for (Map.Entry<MyEnum, String> entry : map.entrySet()) {       
           System.out.println(entry.getKey() + "/" + entry.getValue()); 
 }