代码之家  ›  专栏  ›  技术社区  ›  Hristo

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

  •  7
  • Hristo  · 技术社区  · 15 年前

    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中的所有条目,看看列表'saAccused'是否包含某个名称(对于每个'sAccuser')。这是我迄今为止失败的尝试:

    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 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    8 年前

    这里可能有两种迭代地图的方法。首先,您可以使用 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 是一个对象,它遍历一些数据结构,依次表示每个元素。迭代器的典型用法如下所示:

    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() 方法来获取该元素。但是,由于上述模式非常常见,因此可以使用Java5来忽略它 foreach loop

        2
  •  3
  •   quantumSoup    15 年前

    for (List<String> list : theAccused.values()) {
        if (list.contains("somename")) {
            // found somename
        }
    }
    
        3
  •  2
  •   Bozho    15 年前

    这将使它工作:

    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)) {
        }
    }
    
        4
  •  0
  •   Brian Agnew    15 年前

    您需要使用 Iterator.next() 索引到 Map .

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

    地图 基于 迭代器

        5
  •  0
  •   DeathB4Decaf    15 年前

    听起来你需要做两件事:第一,找出一个名字是否是“被告”,第二,找出原告是谁。为此,您需要迭代地图中的条目对象。

        for (Entry<String, List<String>> entry : theAccused.entrySet()) {
            if (entry.getValue().contains(accused)) {
                return entry.getKey();
            }
        }
    
        return null; // Or throw NullPointerException, or whatever.
    

        6
  •  0
  •   Jes    15 年前

    制定一个方法:

     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);
    
    推荐文章