2010-02-07 34 views
7

Tengo un problema; Tengo algunos datos y lo muestro con Hashtable por ejemplo, escribo:¿Cómo enumero las claves y valores de una Hashtable?

Enumeration keys; 
    keys=CellTraffic_v.elements(); 
    while(keys.hasMoreElements()) 
     outputBuffer.append(keys.nextElement()+"\n\n"); 

pero me muestran solo los valores ¿Cómo puedo mostrar los valores y las teclas al mismo tiempo? por ejemplo este

si mi llave sea "A" y mi valor sea "B" a mostrar este:

A B 

Gracias ...

+3

Un título mejor podría ser: ¿Cómo puedo enumerar las claves y los valores de una Hashtable –

+0

@Lachlan: sí, de hecho. @OP: Te tomaste la libertad de cambiarlo. –

Respuesta

7

Usted tiene el clave ¿verdad? Usa la tecla para sacar el valor del mapa y tienes todas las asignaciones. Por ejemplo, en Java con String como tipo de clave:

for (String key : map.keySet()) { 
    System.out.println(key + ":" + map.get(key)); 
} 

.

+2

esto es costoso. La solución de Crowder es mucho mejor. – akappa

+0

@akappa: ¿Exactamente de qué manera es este enfoque más costoso? Ambas soluciones iteran la colección de pares clave-valor. – crunchdog

+1

En su solución, realiza una búsqueda en cada iteración, mientras que en la solución entrySet no realiza ninguna búsqueda. – akappa

1

entrySet() devuelve una enumeración de la valores en la tabla Hash.
keySet() devuelve una enumeración de las claves en la tabla Hashtable.
entrySet() devuelve las entradas (clave y valor) como un conjunto

for(Iterator iter=hash.keySet().iterator(); iter.hasNext();) { 
    String key = (String) iter.next(); 
    String value = (String) hash.get(key); 
} 


for(Iteration iter=hash.entrySet().iterator(); iter.hasNext();) { 
    Map.Entry entry = (Map.Entry) iter.next(); 
    String key = (String) entry.getKey(); 
    String value = (String) entry.getValue(); 
} 

o el uso de medicamentos genéricos, en cuyo caso el hash es una secuencia HashMap <, Cadena >

for(String key : hash.keySet()) { 
    String value = hash.get(key); 
} 

for(Map.Entry entry : hash.entrySet()) { 
    String key = entry.getKey(); 
    String value = entry.getValue(); 
} 
+0

Lo sé pero quiero mostrarlos juntos por ejemplo System.out.println (clave + valor); – Freeman

18

Hashtable implementa Map. La función Map.entrySet devuelve una colección (Set) de instancias Map.Entry, que tienen los métodos getKey y getValue.

Así:

Iterator<Map.Entry> it; 
Map.Entry   entry; 

it = yourTable.entrySet().iterator(); 
while (it.hasNext()) { 
    entry = it.next(); 
    System.out.println(
     entry.getKey().toString() + " " + 
     entry.getValue().toString()); 
} 

Si conoce los tipos de las entradas en la tabla hash, puede utilizar plantillas para eliminar las llamadas toString anteriormente. Por ejemplo, entry podría declararse Map.Entry<String,String> si su Hashtable se declara Hashtable<String,String>.

Si usted puede combinar las plantillas con los genéricos, es francamente corto:

for (Map.Entry<String,String> entry : yourTable.entrySet()) { 
    System.out.println(entry.getKey() + " " + entry.getValue()); 
} 

que asume yourTable es una Hashtable<String,String>. Solo muestra lo lejos que ha llegado Java en los últimos años, en gran medida sin perder su Java-ness esencial.

Ligeramente OT: Si no necesita la sincronización, use HashMap en lugar de Hashtable. Si lo hace, use un ConcurrentHashMap (¡gracias, akappa!).

+2

E incluso si necesita sincronización, use un ConcurrentHashMap. – akappa

+0

@akappa: OOOoooh, lindo. @OP: Referencia: http://java.sun.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html –

Cuestiones relacionadas