2009-08-23 14 views
101

Powiel możliwe:
How do I iterate over each Entry in a Map?Jak iterować nad mapą drzewa?

Chcę iteracyjne nad TreeMap, a dla wszystkich kluczy, które mają szczególną wartość, chcę im być dodane do nowej TreeMap. Jak mogę to zrobić?

+1

@Kliknij:”... za„klucz, które mają szczególną wartość ... wszystko ". Czy chodzi ci o wszystkie klucze w danym zestawie, czy o wszystkie klucze spełniające dany predykat? –

Odpowiedz

176

Zakładając TYP TreeMap < String, Integer >:

for(Map.Entry<String,Integer> entry : treeMap.entrySet()) { 
    String key = entry.getKey(); 
    Integer value = entry.getValue(); 

    System.out.println(key + " => " + value); 
} 

(klucz i wartość typy mogą być dowolne clas s oczywiście)

+4

FYI, EntrySet jest preferowanym sposobem do iteracji w dowolnej Mapie, ponieważ EntrySets są zgodne ze specyfikacją i zawsze reprezentują stan danych na mapie, nawet jeśli mapa pod nimi się zmieni. – Esko

+4

Preferowany przez kogo? – Zed

+0

Dodanie do odpowiedzi Zeda, użycie parametru entrySet da użytkownikowi uprawnienia do usunięcia określonego wpisu podczas iteracji. – SamDJava

24
//create TreeMap instance 
    TreeMap treeMap = new TreeMap(); 

    //add key value pairs to TreeMap 
    treeMap.put("1","One"); 
    treeMap.put("2","Two"); 
    treeMap.put("3","Three"); 

    /* 
     get Collection of values contained in TreeMap using 
     Collection values()   
    */ 
    Collection c = treeMap.values(); 

    //obtain an Iterator for Collection 
    Iterator itr = c.iterator(); 

    //iterate through TreeMap values iterator 
    while(itr.hasNext()) 
     System.out.println(itr.next()); 

czyli

for (Map.Entry<K,V> entry : treeMap.entrySet()) { 
     V value = entry.getValue(); 
     K key = entry.getKey(); 
    } 

czyli

// Use iterator to display the keys and associated values 
    System.out.println("Map Values Before: "); 
    Set keys = map.keySet(); 
    for (Iterator i = keys.iterator(); i.hasNext();) { 
    Integer key = (Integer) i.next(); 
    String value = (String) map.get(key); 
    System.out.println(key + " = " + value); 
    } 
0

Korzystanie Google Collections, zakładając, że K jest twój typ klucza:

Maps.filterKeys(treeMap, new Predicate<K>() { 
    @Override 
    public boolean apply(K key) { 
    return false; //return true here if you need the entry to be in your new map 
    }}); 

Można użyć filterEntries zamiast jeśli potrzebna wartość, jak również.

+0

To nie powoduje żadnego sortowania. – zyamys

5

Wystarczy zwrócić uwagę na ogólny sposób iteracyjne nad dowolną mapę:

private <K, V> void iterateOverMap(Map<K, V> map) { 
    for (Map.Entry<K, V> entry : map.entrySet()) { 
     System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue()); 
    } 
    } 
Powiązane problemy