Как я могу извлечь ArrayList из HashMap и перебрать его в Java? - PullRequest
7 голосов
/ 10 августа 2010

Я настроил HashMap следующим образом:

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

... и я заполняю его, сохраняя для каждого имени (ключа) список имен (значение).Итак:

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

Итак, теперь я хочу просмотреть все записи в HashMap и посмотреть, содержит ли (для каждого sAccuser) список saAccused с определенным именем.Пока это моя неудачная попытка:

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

... однако я не уверен, как работают классы Set и Iterator: / Проблема в том, что у меня нет "значения "... имена ... 'sAccuser' s ... для доступной HashMap.

В двух словах, я хочу перебрать HashMap и проверить, сохранено ли конкретное имя в каком-либоиз списков.Так как я могу это сделать?Дайте мне знать, если вы хотите, чтобы я углубился в детали или прояснил ситуацию.

Спасибо.

Ответы [ 6 ]

4 голосов
/ 10 августа 2010

В двух словах, я хочу перебрать HashMap и проверить, сохранено ли конкретное имя в каком-либо из списков. Так как я могу это сделать?

Есть два способа итерации по карте, которые могут быть здесь интересны. Во-первых, вы можете выполнить итерацию по всем сопоставлениям (то есть парам отношений ключ-значение), используя метод entrySet () , который позволит вам узнать, какой ключ есть у каждого массива. Кроме того, если вам не нужен ключ, вы можете просто получить все списки по очереди с помощью метода values(). Использование первой опции может выглядеть примерно так:

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

Чтобы ответить на более широкие вопросы - интерфейс Set просто представляет (неупорядоченный) набор недублированных значений. Как вы можете видеть по связанному Javadoc, есть доступные методы, которые можно ожидать для такой неупорядоченной коллекции. Итератор - это объект, который пересекает некоторую структуру данных, представляя каждый элемент по очереди. Типичное использование итератора будет выглядеть примерно так:

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
}

то есть проверьте, не исчерпан ли итератор (имеет больше элементов), затем вызовите метод next(), чтобы получить этот элемент. Однако, поскольку вышеприведенный шаблон является настолько распространенным, его можно исключить с помощью foreach loop в Java 5, избавляя вас от работы с самим итератором, как я использовал в своем первом примере.

3 голосов
/ 10 августа 2010

Как то так?

for (List<String> list : theAccused.values()) {
    if (list.contains("somename")) {
        // found somename
    }
}
2 голосов
/ 10 августа 2010

Это должно заставить работать:

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

Однако, чтобы сделать ваш код более читабельным, вы можете иметь:

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

или, если вам нужен ключ:

for (String key : theAccused.keySet()) {
    List<String> accused = theAccused.get(key);
    if (accused.contains(sAccuser)) {
    }
}
0 голосов
/ 10 августа 2010

Похоже, вам нужно сделать две вещи: во-первых, выяснить, является ли данное имя «обвиняемым», а во-вторых, выяснить, кто является обвинителем. Для этого вам нужно перебрать объекты Entry на вашей карте.

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

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

В этом цикле объект Entry содержит одно сопоставление значения ключа. Итак, entry.getValue () содержит список обвиняемых, а entry.getKey () содержит их обвинителей.

0 голосов
/ 10 августа 2010

Создайте метод, который делает это:

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

А когда вы вызываете метод:

String key = findListWithKeyword(map, "foobar");
ArrayList<String> theCorrectList = map.get(key);
0 голосов
/ 10 августа 2010

Вам нужно использовать значение из Iterator.next() для индексации в Map.

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

В настоящее время вы получаете значения из Map на основе итератора , а не значений, возвращаемых итератором.

...