web-dev-qa-db-ja.com

Java keySetに対する反復

私は次のJavaコードを持っています:

public void myMethod (final Map pFeatureGroupsFromPackage) {

   final Set<String> keys = pFeatureGroupsFromPackage.keySet();

   for (final String key : keys) {
           tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key);
    // do whatever
   }
}

「findBugs」から次のような警告が表示されます。

メソッドmyMethodは、entrySetイテレータの代わりにkeySetイテレータを非効率的に使用します。警告はtmpListassignmentで行われます。

これが非効率的である理由がわかりません。実際、keyslistは1回だけ計算されます。任意のコメント?ありがとう。

13
Luixv

keySetを繰り返し処理してgetを呼び出して各キーに対応する値を取得する代わりに、entrySetを繰り返し処理します。

final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet();

for (Map.Entry<String, List<FeatureKey>> entry : entries) {
    String key = entry.getKey();
    List<FeatureKey> tmpList = entry.getValue();

    // do whatever
}

そうすれば、すべてのキーについてマップでルックアップを行う必要はありません。キーと値を一度に直接取得できます。

また、型パラメーターを使用してMapを宣言します。

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
    // ...
}
26
Jesper

すべてのキーを取得してから、コレクション内のすべてのキーを検索します

map.EntrySetの反復ははるかに高速で、小さな例です。

ただし、ジェネリックも使用する必要があります...

Set entries = map.entrySet();
      Iterator entryIter = entries.iterator();
      System.out.println("The map contains the following associations:");
      while (entryIter.hasNext()) {
         Map.Entry entry = (Map.Entry)entryIter.next();
         Object key = entry.getKey();  // Get the key from the entry.
         Object value = entry.getValue();  // Get the value.
         System.out.println( "   (" + key + "," + value + ")" );
      }
4
sharpner

これはあなたを助けるかもしれません:

Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    Integer key = (Integer)entry.getKey();
    Integer value = (Integer)entry.getValue();
    System.out.println("Key = " + key + ", Value = " + value);
}
3
user2706780

マップを2回クエリしている可能性があります。

  • 最初に鍵については、
  • 値の2番目

Entryset iteratorを使用すると、マップを1回繰り返します。

0
batkovladko

KeySetイテレータを介してHashMapにアクセスすることは、TreeMapでkeySetイテレータを使用するよりもさらに高速です。

0
developer

ちょっとLuixv、keyseyイテレータを使用する理由はentryset iteratotよりも効果的ではありません。最初のオプションでは、2番目のオプションでは回避されるMap.get(key)ルックアップを使用する必要があるためです。

0
Assaf Adato

サンプルコード:

for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
    System.out.println(i.getValue() + " " + i.getKey()));
}
0
Mikhail