0

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

}
 }
4

3 回答 3

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

于 2013-06-19T16:04:16.607 回答
0
containsValue = map1.equals(map2.values());

应该:

containsValue = map1.values().equals(map2.values());

while(it.hasNext())在您的代码中没用,并且您没有在循环内使用迭代器。关于定义 的列表char[],请使用:

List<char[]> list;
于 2013-06-19T16:02:52.190 回答
0

所有错误的事情从哪里开始。

仅当它们是完全相同的对象而不考虑内容时,调用Object.equalsachar[]才会返回。true我注意到你不依赖于此。

您正在使用迭代器,但从不调用next. 最好使用豪华的 for 循环。

您正在将 aMap与 a Collection(Map不是(通常) a Collection)进行比较,所以这是行不通的。

Collectionfrom是一个包,Map.values只有没有java.util.Bag. 因此,它碰巧使用了 default Object.equals,甚至不会与具有从另一个返回的相同元素的集合进行比较Map.values(除非它是完全相同的实例)。

如果您试图比较这两个values集合,那么我们就有问题了。我们可以通过将一个集合复制到 aHashSet然后调用来轻松查看公共元素retainAll。要进行包比较,您很容易必须使用第三方库(可能是 Guava,我自己没有使用过)或自己实现算法。比如说,使用两个迭代器同时复制到Lists、排序和迭代两者。

于 2013-06-19T16:13:40.843 回答