如何从HashMap中提取ArrayList并在Java中循环它?

Hri*_*sto 7 java lookup contains arraylist hashmap

我已经像这样设置了一个HashMap:

Map<String, ArrayList<String>> theAccused = new HashMap<String, ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

...我通过存储每个名称(键),一个名称列表(值)来填充它.所以:

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

所以现在,我想查看HashMap中的所有条目,看看(对于每个'sAcucuser')列表'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();
}
Run Code Online (Sandbox Code Playgroud)

...但是我不确定SetIterator类是如何工作的:/问题是我没有"值"...名称... 'sAccuser's ...用于HashMap可用.

简而言之,我想迭代HashMap并检查特定名称是否存储在任何列表中.那我该怎么做呢?如果您需要我进一步了解或清除任何混淆,请告诉我.

谢谢.

And*_*yle 5

简而言之,我想遍历 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
   }
}
Run Code Online (Sandbox Code Playgroud)

为了回答更广泛的问题 - 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
}
Run Code Online (Sandbox Code Playgroud)

也就是说,检查迭代器是否未耗尽(有更多元素),然后调用该next()方法来获取该元素。但是,由于上述模式非常常见,因此可以使用 Java 5 的foreach 循环来省略它,从而使您无需处理迭代器本身,正如我在第一个示例中所利用的那样。