2015-05-24 28 views
-1

想我已经宣布枚举和相应的emummap为:有什么更好的迭代Java中的EnumMap?

enum MyEnum { 
    CONSTANT1, CONSTANT2, CONSTANT3; 
} 

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

我想遍历MyEnumMap,例如,只打印每个Entry一个接一个。

什么是最好的方法(最快)遍历键在下列情况下:当确保每个常数MyEnumMyEnumMap

  • 关键

    1. MyEnum每个常数可以或者可能不MyEnumMap

    我想用MyEnumMap.keySet()MyEnum.values() foreach循环之间做出选择的关键。任何其他方法都是最受欢迎的。

  • +0

    除非你发现你的代码的这一特定部分是在现实生活状况的一个瓶颈,你不应该试图去优化它。使用最可读和清晰的方式。 – RealSkeptic

    +0

    @RealSkeptic我同意你的意见。但是我今天读到了这个数据结构,并希望从最简单但优化的方法开始使用它。 'MyEnumMap.keySet()'或'MyEnum.values()'都是可读的,但我想用更好的一个 – Mukund

    +0

    这被称为“过早优化”。它被认为是一种*糟糕的编程方法。 – RealSkeptic

    回答

    1

    如果你看一看的EnumMap#keySet()

    381 publicSet <K> keySet() {
    382 Set <K> ks = keySet;
    383 if (ks != null)
    384 return ks;
    385 else
    386 return keySet = newKeySet();
    387 }

    代码,你会发现,它返回由EnumMap内部用来存储密钥keySet

    现在每个我们称之为时间MyEnum.values()我们得到不同的阵列摆满了枚举元素。这意味着第一个空数组被创建,以后需要用所有需要迭代的枚举来填充。

    所以在第一种方法便是通过跳过迭代已经通过地图存储枚举,而insecond方法,我们只是创造一些临时数组涉及附加重复对所有MyEnum元素。

    0

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

    1)

    // 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 
    } 
    

    2),但它仍然是最好使用1),因为你可以有那里的信息枚举值不包含在Map中。

    for (MyEnum e: MyEnumMap.keySet()) { 
        // you can check here all that is in your map, but you cant tell what is in enum but not in your map 
    } 
    
    +0

    你能否证明你的答案是正当的。你是什​​么意思“但它仍然更好使用2)” – Mukund

    2

    没关系。在内部,EnumMapimplemented有一对相同的长度enum的条目的数量的阵列。一个阵列具有enum元素,而第二阵列具有映射到它们,或NULL占位符对象。在EnumMap任何迭代因此相当于for环路上横穿的enum序的整个范围的整数索引,所以你应该选择那些使你的代码最可读的,以你的方式。

    +0

    如果是这样的话,为什么它比一个HashMap(如我所读的地方)更好?另外,如果我使用'MyEnumMap.keySet()'进行迭代,那么我不会为未明确放入映射的键获取空值键。 – Mukund

    +0

    @Mukund它比'HashMap'更好,因为大多数'enum'都有少量的条目。如果你使用一个具有10,000个条目的'enum',并且使用具有10..15个条目的映射,则'HashMap'会更快一个数量级。请注意,在我的回答中,我提到了'NULL'占位符。该实现使用它们在迭代过程中跳过尚未明确设置为“空”的条目。查看源使用'unmaskNull(...)'方法的方式。 – dasblinkenlight

    -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()); 
    } 
    
    +0

    这是怎么回事? OP明确询问'MyEnum.values()'。 – Pshemo

    相关问题