2013-06-22 67 views
0

我知道如何遍歷一個hashmap,但我不確定是否可以在單個Hashmap上設置2個迭代器?如何在一個hashmap上設置2個迭代器

讓的說,我有以下的HashMap:

Map m = new HashMap<Integer, String>; 
m.put(112334,"A"); 
m.put(221345,"B"); 
m.put(321411,"C"); 
m.put(431254,"D"); 

我想取出值的HashMap的所有組合以這樣一種方式,沒有對被重複。所以在這種情況下,4個值 - > 6對(AB,AC,AD,BC,BD,CD)。我想的是這樣的:

for(int i=0; i < (size-1); i++) 
    for(int l = 1; < size; l++).... 

但在java中我們使用迭代器,所以我怎麼能使用迭代器呢? (如果您可以找到一種方法來使用該集合的索引,那也可以)。

PS:對不起,我剛剛從C++移動到Java,所以我需要你的幫助啓動。

+0

好,我找到了一種方法來解決這個我需要的只是將hashmap轉換爲arraylist。它應該更好 列表 mylist = new ArrayList (m.values()); – Nexus

回答

1

確保這些值實施了Comparable。字符串實現Comparable<String>所以你很好(如果你喜歡,請閱讀關於Comparable的一些教程)。

執行雙迴路得到所有對(X,Y),然後排除(X,X)和(Y,X)使用compareTo方法:

Map<Integer, String> map = new HashMap<Integer, String>(); 
map.put(112334,"A"); 
map.put(221345,"B"); 
map.put(321411,"C"); 
map.put(431254,"D"); 

Collection<String> values = map.values(); 
for (String str1 : values) { 
    for (String str2 : values) { 
     if (str1.compareTo(str2) < 0) { 
      System.out.println(String.format("unique pair: (%s, %s)", str1, str2)); 
      // or whatever you want but do not modify map here! 
     } 
    } 
} 
+0

你的意思是什麼?你想要我做一個雙循環來看看這個對是否存在?所以如果我有N個元素,那麼我必須得到所有N * N個對並檢查?它比我剛剛得到N *(N-1)/ 2對更快嗎?我不得不說,我的集合包含超過100,000個元素... – Nexus

+0

@Nexus讓我的答案更加冗長(第一個版本來自智能手機)。現在關於性能問題:「不成熟的優化是萬惡的根源」(你可以谷歌爲此)。先試試簡單的方法。如果結果太慢,那麼你仍然可以使用數組。或切換回C. C是寫好快速程序的好幫手。 Java對於編寫可讀和可維護的程序非常有用。 – user829755

+0

好吧,聽起來不錯,你使用集合而不是陣列,我會嘗試拍攝:)) – Nexus

0

鑑於您的其他方法,使用兩個for循環沒什麼問題,因爲您在問題中發佈了兩個以及幾個修復程序。

for(int i=0; i < (size-1); i++) 
    for(int l = i+1; l < size; l++).... 

這就是說,它肯定不會是我使用Map當數組可能是你真正想要的方式。

+0

對不起,我不好,我想我應該更具體。此處的(整數)鍵不存儲索引。它存儲了另一個整數值,不能用於迭代,所以想象它是這樣的 m.put(11234,「A」); m.put(23451,「B」); m.put(31235,「C」); m.put(51233,「D」); – Nexus