2010-08-09 22 views
7

que han establecido un HashMap así:¿Cómo puedo extraer ArrayList de HashMap y recorrerlo en Java?

Map<String, ArrayList<String>> theAccused = new HashMap<String, ArrayList<String>>(); 

... y poblar esto almacenando para cada nombre (clave), una lista de nombres (valor). Por lo tanto:

ArrayList<String> saAccused = new ArrayList<String>(); 
// populate 'saAccused' ArrayList 
... 
// done populating 
theAccused.put(sAccuser, saAccused); 

Así que ahora, quiero mirar a través de todas las entradas en el HashMap y ver si (para cada 'sAccuser'), la lista 'saAccused' contiene un cierto nombre. Este es mi intento fracasado hasta ahora:

Set<String> setAccusers = theAccused.keySet(); 
Iterator<String> iterAccusers = setAccusers.iterator(); 
iterAccusers.next(); 
ArrayList<String> saTheAccused; 

// check if 'sAccuser' has been accused by anyone before 
for (int i = 0; i < theAccused.size(); i++) { 
    saTheAccused = theAccused.get(iterAccusers); 

    if (saTheAccused.contains(sAccuser)) { 

    } 
    iterAccusers.next(); 
} 

... sin embargo no estoy seguro de cómo funcionan los Set y Iterator clases:/El problema es que no tengo los "valores" ... el nombres ... 'sAccuser' s ... para el HashMap disponible.

En pocas palabras, quiero iterar a través del HashMap y verificar si un nombre específico está almacenado en cualquiera de las listas. Entonces, ¿cómo puedo hacer esto? Avíseme si necesita que entre más detalles o aclare cualquier confusión.

Gracias.

+1

+1 Sheesh! Un montón de respuestas, pero ninguna de las contestadoras se molestó en contestar la pregunta. Un voto ascendente significa que la pregunta está bien escrita, es específica y muestra lo que el usuario ya ha intentado. Esta pregunta cumple todos los requisitos para un voto popular. –

+0

@Jim ... :) ¡Gracias! Wow ... se siente realmente bien finalmente tener alguien que me reconozca de esta manera. Muchas gracias ... Desearía que más gente pensara como tú :) ¡Gracias! +1 para especificar que mi pregunta cumple todos los requisitos para un voto popular. – Hristo

+0

@Jim Garrison tiene razón, pero para mí existen dos requisitos más: la pregunta debe ser difícil y de interés común, es decir, cuando tenga el problema, Google debería llevar a esta pregunta. – Bozho

Respuesta

4

En pocas palabras, quiero iterar a través del HashMap y verificar si un nombre específico está almacenado en cualquiera de las listas. Entonces, ¿cómo puedo hacer esto?

Hay dos formas de recorrer el mapa que pueden ser de interés aquí. En primer lugar, puede iterar a través de todas las asignaciones (es decir, pares de relaciones clave-valor) utilizando el método entrySet(), que le permitirá saber cuál es la clave para cada lista de arrays. Alternativamente, si no necesita la clave, simplemente puede obtener todas las listas a su vez a través del método values(). Utilizando la primera opción podría ser algo como esto:

for (Map.Entry<String, ArrayList<String>> entry : theAccused.entrySet()) 
{ 
    String sListName = entry.getKey(); 
    ArrayList<String> saAccused = entry.getValue(); 
    if (saAccused.contains(sAccuser)) 
    { 
     // Fire your logic for when you find a match, which can 
     // depend on the list's key (name) as well 
    } 
} 

para responder las preguntas más amplias - la interfaz Set representa simplemente una colección (no ordenado) de valores no duplicadas. Como puede ver en el Javadoc vinculado, hay métodos disponibles que podría esperar para una colección desordenada. Un Iterator es un objeto que atraviesa una estructura de datos que presenta cada elemento sucesivamente.El uso típico de un iterador sería algo como lo siguiente:

Iterator<?> it = ...; // get the iterator somehow; often by calling iterator() on a Collection 
while (it.hasNext()) 
{ 
    Object obj = it.next(); 
    // Do something with the obj 
} 

es decir, comprobar si se nonexhausted el iterador (tiene más elementos) a continuación, llamar al método next() para conseguir ese elemento. Sin embargo, dado que el patrón anterior es tan común, se puede elidir con el foreach loop de Java 5, evitando que se ocupe del iterador mismo, como aproveché en mi primer ejemplo.

+0

Guau ... ¡Gracias por esa respuesta! Pregunta rápida ... cuando dice 'Iterater it = ...;', ¿es igual a un elemento, en mi caso, es igual a un elemento del conjunto? Gracias por el enlace a 'para-cada'. Nunca lo he usado ¡Respuesta estelar! – Hristo

+0

Además ... si volvemos a su bucle for ... si encuentro una coincidencia, ¿cómo puedo extraer el nombre (clave) de ArrayList que contiene 'sAccuser'? – Hristo

+1

@Hristo - la variable 'it' sería un objeto que devolvería sucesivos elementos de la colección subyacente cada vez que se llamaba a su método' next() ', no a un elemento en sí mismo. En cuanto a su segunda pregunta, modifiqué mi ejemplo para mostrarlo usando 'entrySet()', ya que esta es la forma de iterar sobre un mapa cuando se preocupan por las claves * y *. –

0

Debe utilizar el valor de Iterator.next() para indexar en el Map.

String key = iterAccusers.next(); 
saTheAccused = theAccused.get(key); 

valores Actualmente se está recibiendo de la Map basan en el iterador , no los valores devueltos por el iterador.

3

¿Algo como esto?

for (List<String> list : theAccused.values()) { 
    if (list.contains("somename")) { 
     // found somename 
    } 
} 
2

Esto debería hacer que funcione:

saTheAccused = theAccused.get(iterAccused.next()); 

Sin embargo, para que su código sea más legible, puede tener:

for (List<String> values : theAccused.values()) { 
    if (value.contains(sAcuser)) { 
     .. 
    } 
} 

o, si necesita la clave:

for (String key : theAccused.keySet()) { 
    List<String> accused = theAccused.get(key); 
    if (accused.contains(sAccuser)) { 
    } 
} 
+0

Gracias. Esto es lo que necesitaba. Sin embargo, reviso tu respuesta ... Estaba buscando una ArrayList ... No quiero que recibas un downvoted por una estúpida razón :) – Hristo

+0

@Hristo obtienes una 'ArrayList', pero la haces referencia por su interfaz -' List', que se considera una práctica mejor (a menos que realmente necesite los métodos específicos de 'ArrayList') – Bozho

+2

Si necesita tanto la clave como el valor, debe usar entrySet, en lugar de keySet y get. – ILMTitan

0

Hacer un método que lo hace:

private String findListWithKeyword(Map<String, ArrayList<String>> map, String keyword) { 
    Iterator<String> iterAccusers = map.keySet().iterator(); 
    while(iterAccusers.hasNext()) { 
     String key = iterAccusers.next(); 
     ArrayList<String> list = theAccused.get(key); 
     if (list.contains(keyword)) { 
     return key; 
     } 
    } 
} 

Y cuando se llama al método:

String key = findListWithKeyword(map, "foobar"); 
ArrayList<String> theCorrectList = map.get(key); 
+0

.. gracias por su respuesta. Ya estoy escribiendo un método que está haciendo esto. Este es el punto de mi pregunta :) Pregunta rápida ... cuando dice 'Iterater iterAccusers = ...;', es iterAccusers igual a un elemento, en mi caso, es igual a un elemento del conjunto, o ¿No está inicializado para empezar? – Hristo

+0

Además, una pregunta más ... si encuentro una coincidencia, ¿cómo puedo extraer el nombre (clave) de ArrayList que contiene 'sAccuser' al que pertenece? – Hristo

+0

iterAccusers es un iterador, es decir, puede llamar a next() y obtener el siguiente elemento. Es como un bucle for-each. El iterador NO es un elemento en el conjunto, es un objeto usado para iterar a través del conjunto. En cuanto a extraer la clave. En lugar de devolver la lista, simplemente devuelva la clave. Ver el código editado. – Jes

0

Suena como que tiene que hacer dos cosas: en primer lugar, averiguar si un nombre dado es "acusado", y segundo, descubre quién es el acusador. Para eso, necesita iterar sobre los objetos de Entrada dentro de su Mapa.

for (Entry<String, List<String>> entry : theAccused.entrySet()) { 
     if (entry.getValue().contains(accused)) { 
      return entry.getKey(); 
     } 
    } 

    return null; // Or throw NullPointerException, or whatever. 

En este bucle, el objeto Entry tiene una sola correlación de valores-clave. Entonces entry.getValue() contiene la lista de acusados, y entry.getKey() contiene su acusador.

+0

.. ¿qué es un objeto de entrada? No he encontrado eso todavía. – Hristo

+0

En realidad es una clase interna de mapa. El nombre de clase completo es java.util.Map.Entry. (El JavaDoc está aquí: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html) En mi experiencia, rara vez se usa. Sin embargo, en este caso funciona muy bien, y como es parte de Map API, no hay razón para no usarlo. – DeathB4Decaf

Cuestiones relacionadas