2013-06-19 62 views
0

我現在正在玩hashmaps。我試圖弄清楚如何比較兩個hashmaps的值 - 當每個hashmap的值是一個char數組。我環顧四周發現了一些可能有用的方法 - 我只是不確定如何正確實施。基本上我有兩個具有不同鍵的地圖,但具有相同的值。我想遍歷其中一個映射並創建一個布爾值,如果它們具有相同的值,則返回true。如果有人能幫我弄清楚,那就太好了。我的代碼如下什麼我迄今爲止嘗試:將char數組作爲值進行比較 - Java

publipublic class MapExample { 

public static void main(String[] args) { 

    Map<String, char[]> map1 = new HashMap<String, char[]>(); 
    Map<String, char[]> map2 = new HashMap<String, char[]>(); 

    char[] letters1 = new char[3]; 
    letters1[0] = 'a'; 
    letters1[1] = 'b'; 
    letters1[2] = 'c'; 

    char[] letters2 = new char[3]; 
    letters2[0] = 'x'; 
    letters2[1] = 'y'; 
    letters2[2] = 'z'; 

    map1.put("1", letters1); 
    map1.put("2", letters2); 
    map1.put("3", letters1); 

    map2.put("4", letters1); 

    Set s = map1.entrySet(); 
    Iterator it = s.iterator(); 

    boolean containsValue; 

    //I've tried this but it produces false (and infinite loop) when maps have the same value 
    while (it.hasNext()) { 

     containsValue = map1.equals(map2.values()); 
     System.out.println(containsValue); 
    } 

    //I've tried this too, but can't seem to adjust the lists to accept char[] 
    /* 
    List<String> values1 = new ArrayList<String>(map1.values()); 
    List<String> values2 = new ArrayList<String>(map2.values()); 
    Collections.sort(values1); 
    Collections.sort(values2); 
    boolean mapsHaveEqualValues = values1.equals(values2);*/ 

} 
} 
+0

你的無限循環是因爲你沒有推進迭代器。你需要在某個時候調用'it.next()'。 – pamphlet

回答

0
containsValue = map1.equals(map2.values()); 

應該是:

containsValue = map1.values().equals(map2.values()); 

while(it.hasNext())是在你的代碼無用的,你沒有使用內循環迭代。關於界定char[]列表,使用:

List<char[]> list; 
+0

我改變了containsValue,但仍然有一個問題:你能給我一個例子,添加到列表名單? – David

+0

從Map.value返回的'Collection'是呃奇怪的。不(必然)重寫'Object.equals'。 –

1

無限循環

您需要使用it.next()推進Iterator。您一直在迭代器上調用hasNext(),而不將其轉發給下一個元素。

hasNext():如果迭代器有更多元素

返回true。 (換句話說,如果下一個()將返回一個元素而不是拋出一個異常返回true。)

next()

返回下一個元素的迭代。

while (it.hasNext()) { 
    // need to use it.next() somewhere, but you don't really need loop here 
    containsValue = map1.equals(map2.values()); 
    System.out.println(containsValue); 
} 

map1.equals(map2.values());

我覺得你想要做什麼map1.values().equals(map2.values());

List<String> values1 = new ArrayList<String>(map1.values());

定義Character[]代替char[]並添加到Map<String, Character[]> map1和名單List<Character[]> values1 = new ArrayList<Character[]>(map1.values());

+0

謝謝,我應該知道一個。 – David

+0

等於永遠不會是真的。 – Fildor

0

從哪裏開始,所有的事情都是錯誤的。

char[]上調用Object.equals只會返回true如果它們完全相同,則與內容無關。我注意到你不依賴於此。

您正在使用迭代器,但從未呼叫next。最好使用一個豪華的循環。

您正在比較MapCollectionMap不是(通常)Collection),所以這是行不通的。

CollectionMap.values是一個包,只有沒有java.util.Bag。因此,它恰巧使用默認的Object.equals,並且甚至不會比較與從另一個Map.values返回的相同元素的集合相等(除非它是完全相同的實例)。

如果您試圖比較兩個values集合,那麼我們有一個問題。我們可以通過將一個集合複製到HashSet然後調用retainAll來輕鬆查看常見元素。要做一個包比較,你很容易不得不使用第三方庫(番石榴可能,不是自己使用它)或自己實現算法。說,複製到Lists,排序和迭代通過兩個迭代器一次。