2010-08-09 79 views
7

我已成立了一個HashMap像這樣:如何從HashMap中提取ArrayList並在Java中循環訪問它?

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

...但我不知道該SetIterator類是如何工作的:/的問題是,我沒有「價值」的...名字... 'sAccuser' s ...爲可用的HashMap。

簡而言之,我想遍歷HashMap並檢查某個特定名稱是否存儲在任何列表中。那我該怎麼做?讓我知道你是否需要我進一步細節或澄清任何混淆。

謝謝。

+1

+1哎!大量的答案,但不是回答者提出這個問題的麻煩之一? upvote意味着這個問題寫得很好,具體,並顯示用戶已經嘗試過的內容。這個問題符合upvote的所有要求。 – 2010-08-09 22:05:38

+0

@Jim ... :)謝謝!哇...終於有人以這種方式認出我真的很高興。非常感謝你......我希望有更多的人像你一樣思考:)謝謝! +1用於指定我的問題滿足upvote的所有要求。 – Hristo 2010-08-09 22:09:15

+0

@Jim Garrison你是對的,但對我來說還有兩個要求 - 這個問題應該很難,並且有共同的興趣 - 即當你遇到問題時,使用谷歌搜索應該會導致這個問題。 – Bozho 2010-08-09 22:33:29

回答

4

簡而言之,我想遍歷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是遍歷某個數據結構的對象,依次呈現每個元素。迭代器的典型用法將類似於以下內容:

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 
} 

就是檢查迭代器是否nonexhausted(有多個元素),然後調用next()方法來獲取元素。然而,由於上面的圖案是如此普遍,它可以用Java 5的foreach loop省略的,從對付迭代器本身饒恕你,因爲我在我的第一個例子了優勢。

+0

哇......謝謝你的迴應!快速的問題...當你說'Iterater 它= ...;',是不是等於一個元素,於我而言,是等於從設置元素?感謝鏈接到「for-each」。我從來沒有用過它。恆星的答案! – Hristo 2010-08-09 22:07:15

+0

另外...如果我們回到你的for循環...如果我找到一個匹配,我如何提取包含'sAccuser'的ArrayList的名稱(鍵)? – Hristo 2010-08-09 22:12:23

+1

@Hristo - 「it」變量是一個對象,每次調用next()方法時都會返回基礎集合的連續元素,而不是元素本身。至於你的第二個問題,我修改了我的示例,使用'entrySet()'來顯示它,因爲當你關心鍵*和*值時,這是迭代Map的方式。 – 2010-08-10 00:07:55

0

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

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

Map目前你得到的值基礎上,迭代,而不是由迭代器返回的值。

3

像這樣?

for (List<String> list : theAccused.values()) { 
    if (list.contains("somename")) { 
     // found somename 
    } 
} 
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)) { 
    } 
} 
+0

謝謝。這是我需要的。儘管修改你的答案...我正在尋找一個ArrayList ...我不希望你因爲一個愚蠢的原因而陷入低谷:) – Hristo 2010-08-09 22:16:38

+0

@Hristo你得到一個'ArrayList',但你通過它的接口引用它 - List',這被認爲是一種更好的做法(除非你真的需要'ArrayList'特有的方法) – Bozho 2010-08-09 22:29:54

+2

如果你需要key和value兩個參數,你應該使用entrySet,而不是keySet和get。 – ILMTitan 2010-08-09 23:45:22

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

..感謝您的回覆。我已經在寫這樣一個方法。這是我的問題的重點:)快速的問題...當你說'Iterater iterAccusers = ...;',它是等於一個元素,在我的情況下,它等於一個元素從集合,或開始時是否未初始化? – Hristo 2010-08-09 22:15:07

+0

另外,還有一個問題......如果我找到了匹配項,我如何提取包含'sAccuser'的ArrayList的名稱(鍵),它屬於? – Hristo 2010-08-09 22:19:02

+0

iterAccusers是一個迭代器,即你可以調用next()並獲得下一個元素。這就像一個for-each循環。迭代器不是集合中的元素,它是用於迭代集合的對象。 至於提取密鑰。而不是返回列表,只需返回密鑰。請參閱編輯的代碼。 – Jes 2010-08-10 08:08:48

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()包含他們的控告者。

+0

..什麼是Entry對象?我還沒有遇到過。 – Hristo 2010-08-10 00:53:00

+0

它實際上是一個內部的地圖類。完整的類名是java.util.Map.Entry。 (JavaDoc在這裏:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html)根據我的經驗,它很少使用。然而,在這種情況下,它很好地服務,並且因爲它是Map API的一部分,所以沒有理由不使用它。 – DeathB4Decaf 2010-08-10 21:25:56

相關問題