2009-08-23 41 views
101

Duplicar posibles:
How do I iterate over each Entry in a Map?¿Cómo iterar sobre un TreeMap?

Quiero repetir un TreeMap, y para todas las claves que tienen un valor particular, quiero que se pueden añadir a una nueva TreeMap. ¿Cómo puedo hacer esto?

+1

@Haga clic en:" ... para toda la llave' de los cuales tienen un valor particular ...". ¿Quiere decir para todas las claves en un conjunto dado, o para todas las claves que satisfacen un predicado determinado? –

Respuesta

176

Suponiendo tipo TreeMap < cadena, entero >:

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

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

(tipos de clave y valor puede ser cualquier clas s por supuesto)

+4

Para su información, EntrySet es la forma preferida de iterar a través de cualquier mapa ya que los EntrySets son por especificación reflexiva y siempre representan el estado de los datos en el mapa, incluso si el mapa debajo cambiara. – Esko

+4

¿Preferido por quién? – Zed

+0

Añadiendo a la respuesta de Zed, el uso de entrySet dará al usuario la posibilidad de eliminar una entrada en particular mientras se itera. – 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()); 

o:

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

o:

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

Usando Google Collections, suponiendo que K es el tipo de clave:

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

Puede utilizar filterEntries lugar si se necesita el valor también.

+0

Esto no hace ninguna clasificación. – zyamys

5

Sólo para señalar la forma genérica para iterar sobre cualquier mapa:

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