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

时间:2013-06-19 15:59:46

标签: java hashmap arrays

我正在玩乱码图。我试图弄清楚如何比较两个哈希图的值 - 当每个哈希图的值是一个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);*/

}
 }

3 个答案:

答案 0 :(得分:1)

无限循环

您需要使用it.next()推进Iterator。你继续在迭代器上调用hasNext()而不将其转发到下一个元素。

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

答案 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。最好使用豪华循环。

您正在将CollectionMap进行比较(Collection不是(通常)Collection),因此无效。

来自Map.values的{​​{1}}是一个包,只有java.util.Bag。因此,它恰好使用默认的Object.equals,甚至不会比较具有从另一个Map.values返回的相同元素的集合(除非它是完全相同的实例)。

如果您尝试比较两个values集合,那么我们就遇到了问题。我们可以通过将一个集合复制到HashSet然后调用retainAll来轻松查看常见元素。要做一个袋子比较,你很容易使用第三方库(可能是番石榴,我自己不用它)或自己实现算法。比如说,复制到Lists,使用两个迭代器一次排序并迭代两者。