我正在玩乱码图。我试图弄清楚如何比较两个哈希图的值 - 当每个哈希图的值是一个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);*/
}
}
答案 0 :(得分:1)
无限循环
您需要使用it.next()
推进Iterator
。你继续在迭代器上调用hasNext()
而不将其转发到下一个元素。
如果迭代有更多元素,则返回true。 (换句话说,如果next()返回一个元素而不是抛出异常,则返回true。)
返回迭代中的下一个元素。
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());
答案 1 :(得分:0)
containsValue = map1.equals(map2.values());
应该是:
containsValue = map1.values().equals(map2.values());
while(it.hasNext())
在代码中没用,你没有在循环中使用迭代器。关于定义char[]
列表,请使用:
List<char[]> list;
答案 2 :(得分:0)
从哪里开始处理所有错误的事情。
Object.equals
上的char[]
只有true
才会返回next
,如果它们完全相同,则无论内容如何。我注意到你并不依赖于此。
您正在使用迭代器,但从不调用Map
。最好使用豪华循环。
您正在将Collection
与Map
进行比较(Collection
不是(通常)Collection
),因此无效。
来自Map.values
的{{1}}是一个包,只有java.util.Bag
。因此,它恰好使用默认的Object.equals
,甚至不会比较具有从另一个Map.values
返回的相同元素的集合(除非它是完全相同的实例)。
如果您尝试比较两个values
集合,那么我们就遇到了问题。我们可以通过将一个集合复制到HashSet
然后调用retainAll
来轻松查看常见元素。要做一个袋子比较,你很容易使用第三方库(可能是番石榴,我自己不用它)或自己实现算法。比如说,复制到Lists
,使用两个迭代器一次排序并迭代两者。