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

时间:2010-08-09 21:50:49

标签: java arraylist hashmap lookup contains

我已经像这样设置了一个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中的所有条目,看看(对于每个'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();
}

...但是我不确定SetIterator类是如何工作的:/问题是我没有“值”......名字......可用的HashMap 'sAccuser' ...

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

感谢。

6 个答案:

答案 0 :(得分:4)

  

简而言之,我想迭代HashMap并检查特定名称是否存储在任何列表中。那我怎么能这样做呢?

有两种方法可以在这里迭代地图。首先,您可以使用entrySet()方法迭代所有映射(即键值关系对),这将让您知道每个arraylist的键是什么。或者,如果您不需要密钥,则可以通过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是一个对象,它遍历一些数据结构,依次呈现每个元素。迭代器的典型用法如下所示:

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
}

也就是说,检查迭代器是否为非xyusted(有更多元素),然后调用next()方法获取该元素。但是,由于上面的模式是如此常见,因此可以省略Java 5的foreach loop,从而避免处理迭代器本身,因为我在第一个例子中利用了它。

答案 1 :(得分:3)

这样的东西?

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

答案 2 :(得分:2)

这应该有效:

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

答案 3 :(得分:0)

您需要使用Iterator.next()中的值来索引Map

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

目前,您正在根据迭代器Map获取值,而不是迭代器返回的值。

答案 4 :(得分:0)

制作一个方法:

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

答案 5 :(得分:0)

听起来你需要做两件事:首先,找出一个给定的名字是否“被指控”,其次,找出原告是谁。为此,您需要迭代Map中的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()包含他们的原告。