2009-08-23 5 views
101

Possible en double:
How do I iterate over each Entry in a Map?Comment faire une itération sur une TreeMap?

Je veux itérer sur un TreeMap, et pour toutes les clés qui ont une valeur particulière, je veux qu'ils soient ajoutés à une nouvelle TreeMap. Comment puis-je faire ceci?

+1

@Cliquez: » ... pour tous « est la clé qui ont une valeur particulière ... ». Voulez-vous dire pour toutes les clés dans un ensemble donné, ou pour toutes les clés qui satisfont un prédicat donné? –

Répondre

176

En supposant le type TreeMap < String, Entier >:

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

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

(types clés et la valeur peut être tout clas s bien sûr)

+4

FYI, EntrySet est la méthode préférée pour itérer sur n'importe quelle Map puisque les EntrySets sont par spécification réflective et représentent toujours l'état des données dans la Map même si la Map below change. – Esko

+4

Préféré par qui? – Zed

+0

En ajoutant à la réponse de Zed, using entrySet donnera à l'utilisateur le pouvoir de supprimer une entrée particulière pendant l'itération. – 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()); 

ou:

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

ou:

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

En utilisant Google Collections, en supposant K est votre type de clé:

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

Vous pouvez utiliser filterEntries à la place si vous avez besoin de la valeur aussi bien.

+0

Cela ne fait aucun tri. – zyamys

5

Juste pour montrer le chemin générique pour itérer sur une carte:

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()); 
    } 
    } 
Questions connexes