2011-03-25 22 views
10

Aşağıdaki Java kodu vardır:Java Yineleme

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

aşağıdaki söylüyorum "FindBugs" bir uyarı alıyorum: myMethod verimsiz anahtar kümesi yineleyici kullanımı yerine entrySet yapar

Yöntemi yineleyici. Uyarı, tmpList atamasında yapılır. Bu verimsiz olmasının nedeni

anlamıyorum. Aslında keys listesi sadece bir kez hesaplanır. Herhangi bir yorumunuz var mı? Teşekkürler.

cevap

23

, entrySet üzerinde yineleme:

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 
} 

her anahtar için haritasındaki bir arama yapmak gerekmez Bu şekilde; Bir seferde doğrudan anahtarı ve değeri alırsınız.

Ayrıca tür parametreleri ile Map beyan:

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

Merhaba Jesper. Cevabınız için teşekkürler. BTW, iki sözdizimi hatası var (biri eksik '>' ve giriş yerine enty olmalı) :-) +1 ve sizin için kabul – Luixv

+0

@ Luixv teşekkürler, yazım hataları düzeltildi. – Jesper

4

Eğer tüm anahtarları alıyoruz ve sonra koleksiyon bir Map.EntrySet yineleme çok daha hızlı olacağını

, küçük bir örnek her tuş için arama:

Ama aynı zamanda jenerikleri kullanmalıdır. .. Bunun yerine keySet üzerinde iterating ve her anahtar için karşılık gelen değeri elde etmek get çağıran

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

Size iki kez harita sorgulama olduğunu olabilir: - İlk anahtarları için, - değerlerden

için ve ikincisi kullanma entryset yineleyici bir kez harita üzerinde yineleyecek. anahtar kümesi iterasyon yoluyla HashMap erişme

0

daha da hızlı TreeMap üzerinde anahtar kümesi yineleyici kullanarak aşıyor.

0

Hey Luixv, Keysey yineleyicisini kullanmanın sebebi, entryset iteratot'tan daha az etkilidir çünkü ilk seçenekte ikinci seçenekle birlikte kaçınılması gereken Map.get (anahtar) looking özelliğini kullanmanız gerekir.

3

Bu size yardımcı olabilecek:

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

Numune kodu:

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