将映射与字符数组作为值进行比较-Java
我现在正在玩hashmaps。我试图找出如何比较两个hashmap的值——当每个hashmap的值是一个char数组时。我环顾四周,发现了一些可能有效的方法——我只是不知道如何正确地实现。基本上,我有两个不同键但值相同的贴图。我想迭代其中一个映射,并创建一个布尔值,如果它们具有相同的值,则返回true。如果有人能帮我解决这个问题,那就太好了。下面是我迄今为止尝试的代码:将映射与字符数组作为值进行比较-Java,java,hashmap,arrays,Java,Hashmap,Arrays,我现在正在玩hashmaps。我试图找出如何比较两个hashmap的值——当每个hashmap的值是一个char数组时。我环顾四周,发现了一些可能有效的方法——我只是不知道如何正确地实现。基本上,我有两个不同键但值相同的贴图。我想迭代其中一个映射,并创建一个布尔值,如果它们具有相同的值,则返回true。如果有人能帮我解决这个问题,那就太好了。下面是我迄今为止尝试的代码: publipublic class MapExample { public static void main(String[
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);*/
}
}
应该是:
containsValue = map1.values().equals(map2.values());
hasNext在代码中是无用的,并且在循环中没有使用迭代器。关于定义字符[]列表,请使用:
无限循环
您需要使用它。下一步是推进迭代器。您一直在迭代器上调用hasNext,而没有将其转发到下一个元素
:
如果迭代包含更多元素,则返回true。换句话说,如果next将返回一个元素而不是抛出一个异常,则返回true
:
返回迭代中的下一个元素
map1.equalsmap2.values
我想你想做的是map1.values.equalsmap2.values
列表值1=新的ArrayListmap1.values
定义字符[]而不是字符[],并将其添加到映射映射1和列表值1=新ArrayListmap1.values 从哪里开始处理所有错误的事情 在char[]上调用Object.equals只会返回true,前提是它们完全是相同的对象,而与内容无关。我注意到你并不依赖于这个 您正在使用迭代器,但从未调用next。最好使用一个豪华的循环 将地图与集合进行比较地图通常不是集合,因此这不起作用 来自Map.values的集合是一个包,只是没有java.util.bag。因此,它恰好使用默认的Object.equals,甚至不会将equal与具有从另一个Map.values返回的相同元素的集合进行比较,除非它是完全相同的实例
如果您试图比较这两个值集合,那么我们有一个问题。通过将一个集合复制到HashSet,然后调用retainal,我们可以很容易地看到公共元素。要进行包比较,您很容易就必须使用第三方库Guava,而不是自己使用或自己实现算法。比如说,复制到列表,用两个迭代器同时对这两个进行排序和迭代。您的无限循环是因为您没有推进迭代器。你需要调用它。下一步在某个时候。谢谢,我应该知道那一个。等式永远不会是真的。我更改了containsValue,但仍然有一个问题:你能给我一个关于添加到列表的示例吗?从Map.value返回的集合是,呃,奇怪的。不一定覆盖Object.equals。
containsValue = map1.values().equals(map2.values());
List<char[]> list;
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);
}