假设我已将枚举和相应的emummap声明为:
enum MyEnum {
CONSTANT1, CONSTANT2, CONSTANT3;
}
EnumMap<MyEnum, String> MyEnumMap = new EnumMap<MyEnum, String>(MyEnum.class);
我想迭代MyEnumMap
,例如,逐个打印每个Entry
。
在以下情况下迭代密钥的最佳方法(最快)是什么:
MyEnum
中的每个常量都是MyEnumMap
MyEnum
中的每个常量可能是MyEnumMap
我想在使用MyEnumMap.keySet()
或MyEnum.values()
的foreach循环之间进行选择。任何其他方法都是最受欢迎的。
答案 0 :(得分:2)
没关系。在内部,EnumMap
是implemented,其中一对数组的长度与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());
}