Я создал 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 и проверку, если собственное имя хранится в каком-либо из списков. Таким образом, как я могу сделать это? Сообщите мне, нужен ли Вам я, чтобы глубже проникнуть в детали или разрешить какой-либо беспорядок.
Спасибо.
Вкратце, я хочу пройтись по 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 Java 5 , избавляя вас от необходимости иметь дело с самим итератором, как я воспользовался в моем первом примере.
Что-то вроде этого?
for (List<String> list : theAccused.values()) {
if (list.contains("somename")) {
// found somename
}
}
Это должно заставить его работать:
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)) {
}
}
Вам необходимо использовать значение из Iterator.next ()
для индексации в Map
.
String key = iterAccusers.next();
saTheAccused = theAccused.get(key);
В настоящее время вы получаете значения из карты
на основе итератора , а не значений, возвращаемых итератором.
Похоже, вам нужно сделать две вещи: во-первых, выяснить, является ли данное имя "обвиняемым", а во-вторых, выяснить, кто является обвинителем. Для этого вам нужно выполнить итерации по объектам 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() - их обвинителя.
Сделайте метод, который это делает:
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);