将映射与字符数组作为值进行比较-Java

将映射与字符数组作为值进行比较-Java,java,hashmap,arrays,Java,Hashmap,Arrays,我现在正在玩hashmaps。我试图找出如何比较两个hashmap的值——当每个hashmap的值是一个char数组时。我环顾四周,发现了一些可能有效的方法——我只是不知道如何正确地实现。基本上,我有两个不同键但值相同的贴图。我想迭代其中一个映射,并创建一个布尔值,如果它们具有相同的值,则返回true。如果有人能帮我解决这个问题,那就太好了。下面是我迄今为止尝试的代码: publipublic class MapExample { public static void main(String[

我现在正在玩hashmaps。我试图找出如何比较两个hashmap的值——当每个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);*/

}
 }
应该是:

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);
}