簡體   English   中英

如何從HashMap中提取ArrayList並在Java中循環它?

[英]How can I extract ArrayList from HashMap and loop through it in Java?

我已經像這樣設置了一個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類是如何工作的:/問題是我沒有“值”...名稱... 'sAccuser'的...用於HashMap可用。

簡而言之,我想迭代HashMap並檢查特定名稱是否存儲在任何列表中。 那我該怎么做呢? 如果您需要我進一步了解或清除任何混淆,請告訴我。

謝謝。

簡而言之,我想迭代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<?> 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循環 ,從而使你免於處理迭代器本身,正如我在第一個例子中所利用的那樣。

像這樣的東西?

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

目前,您將根據迭代器Map獲取值,而不是迭代器返回的值。

制作一個方法:

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

聽起來你需要做兩件事:首先,找出一個給定的名字是否“被指控”,其次,找出原告是誰。 為此,您需要迭代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()包含他們的原控者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM