[英]Compare maps with char array as values - Java
我現在正在玩hashmap。 我試圖弄清楚如何比較兩個哈希圖的值-當每個哈希圖的值是一個char數組時。 我環顧四周發現了一些可能有效的方法-我只是不確定如何正確實現。 基本上,我有兩個具有不同鍵但值相同的地圖。 我想遍歷其中一張地圖,並創建一個布爾值,如果它們具有相同的值,則返回true。 如果有人可以幫助我解決這個問題,那就太好了。 下面是我到目前為止嘗試過的代碼:
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);*/
}
}
無限循環
您需要使用it.next()
來推進Iterator
。 您一直在迭代器上調用hasNext()
而不將其轉發到下一個元素。
如果迭代具有更多元素,則返回true。 (換句話說,如果next()將返回一個元素而不是引發異常,則返回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());
containsValue = map1.equals(map2.values());
應該:
containsValue = map1.values().equals(map2.values());
while(it.hasNext())
在您的代碼中是無用的,並且您沒有在循環內使用迭代器。 關於定義char[]
的列表,請使用:
List<char[]> list;
從所有錯誤的地方開始。
在char[]
上調用Object.equals
僅在它們完全相同的對象而不考慮內容的情況下才返回true
。 我注意到您並不依賴於此。
您正在使用迭代器,但從未調用next
。 最好使用豪華的循環。
您正在將一個Map
與一個Collection
進行比較( Map
(通常不是Collection
),所以這是行不通的。
Map.values
的Collection
是一個包,只有java.util.Bag
沒有。 因此,它恰好使用默認的Object.equals
,甚至不會將其與具有從另一個Map.values
返回的相同元素的集合進行比較(除非它是完全相同的實例)。
如果您嘗試比較兩個values
集合,那么我們會遇到問題。 通過將一個集合復制到HashSet
,然后調用retainAll
我們可以輕松看到常見元素。 要進行包比較,您很容易就必須使用第三方庫(Guava可能不是我自己使用的)或自己實現算法。 說,復制到Lists
,並使用兩個迭代器一次對它們進行排序和迭代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.