1

enum と対応する emummap を次のように宣言したとします。

enum MyEnum {
    CONSTANT1, CONSTANT2, CONSTANT3;
}

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

たとえばMyEnumMap、それぞれEntryを1つずつ印刷するだけです。

次の場合にキーを反復するための最良のアプローチ(最速)は何ですか:

  1. MyEnum各定数 inがキー in であることが保証されている場合MyEnumMap
  2. の各定数がMyEnumキーである場合とそうでない場合がある場合MyEnumMap

MyEnumMap.keySet()またはを使用して foreach ループを選択したいMyEnum.values()。他のアプローチは大歓迎です。

4

4 に答える 4

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()、すべての enum 要素で満たされた異なる配列が取得されます。これは、最初の空の配列が作成され、後ですべての列挙型で埋める必要があることを意味し、反復が必要です。

したがって、最初のアプローチでは、マップによって既に保存されている列挙型の反復処理をスキップしますが、2 番目のアプローチでは、すべての MyEnum 要素に対する追加の反復処理を含む一時的な配列を作成するだけです。

于 2015-05-24T09:49:50.613 に答える
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()); 
 }
于 2015-05-24T09:59:29.747 に答える
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) の場合でも、Map に含まれていない列挙値の情報を取得できるため、1) を使用する方がよいでしょう。

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
}
于 2015-05-24T09:28:15.140 に答える