2012-07-16 26 views
5

Estoy utilizando Apache Commons Collections para crear un MultiKeyMap que almacenará dos claves con un valor correspondiente y luego usar MapIterator para recorrer el mapa. El problema que tengo es que necesito volver a romper las claves devueltas por MapIterator a las claves individuales en lugar de a un único "compuesto". Aunque podría dividir la cadena que contiene la tecla "compuesta" o usar reflexiones, ninguna de estas opciones parece muy elegante.Break MultiKey devuelto por MapIterator a las claves individuales

Para modelar el problema, he creado el siguiente código de ejemplo

MultiKeyMap multiKeyMap = new MultiKeyMap(); 

multiKeyMap.put("Key 1A","Key 1B","Value 1"); 
multiKeyMap.put("Key 2A","Key 2B","Value 2"); 
multiKeyMap.put("Key 3A","Key 3B","Value 3"); 

MapIterator it = multiKeyMap.mapIterator(); 

while (it.hasNext()) { 
    it.next(); 
    System.out.println(it.getKey()); 
    System.out.println(it.getValue()); 
} 

it.getKey() vuelve multicircuito [clave 3A, 3B Clave], pero lo que yo quiero hacer es asignar las claves de variables individuales, algo así como myKey1 = it.getKey().keys[0] y myKey2 = it.getKey().keys[1] pero no puedo encontrar nada en JavaDoc para lograr esto.

¿Es posible romper las teclas devueltas por el MapIterator en las teclas individuales sin usar reflejos o manipular la cadena devuelta por it.getKey()?

Respuesta

8

Comprobé el source code para los recursos comunes 3.2, y las claves MultiKeyMap son instancias de MultiKey, que tiene un método getKey (int index). También hay un método getKeys() que devuelve Object []. Requiere un lanzamiento, pero usted puede hacer:

MultiKeyMap multiKeyMap = new MultiKeyMap(); 

multiKeyMap.put("Key 1A","Key 1B","Value 1"); 
multiKeyMap.put("Key 2A","Key 2B","Value 2"); 
multiKeyMap.put("Key 3A","Key 3B","Value 3"); 

MapIterator it = multiKeyMap.mapIterator(); 

while (it.hasNext()) { 
    it.next(); 

    MultiKey mk = (MultiKey) it.getKey(); 

    // Option 1 
    System.out.println(mk.getKey(0)); 
    System.out.println(mk.getKey(1)); 

    // Option 2 
    for (Object subkey : mk.getKeys()) 
     System.out.println(subkey); 

    System.out.println(it.getValue()); 
} 
+0

Gracias Eric - La opción 1 es perfecta :) –

Cuestiones relacionadas