即使它们是相同的,.equal也不适用于列表列表

Mon*_*lal 3 java string equals arraylist hashmap

因此,当我检查freqMap1.values()和freqMap2.values()具有相同的值但是当我用.equals检查它时,它返回false.我很困惑如何解决这个问题:

/**
 * Created by mona on 5/26/16.
 */
import java.util.*;

public class IsomorphicStrings {
    //the words "abca" and "zbxz" are isomorphic

    public static boolean areIsomorphic(String s1, String s2) {
        Map<Character, ArrayList<Integer>> freqMap1 = new LinkedHashMap<>();
        Map<Character, ArrayList<Integer>> freqMap2 = new LinkedHashMap<>();

        for (int i=0; i<s1.length(); i++) {
            if (freqMap1.containsKey(s1.charAt(i))) {
                freqMap1.get(s1.charAt(i)).add(i);
            } else {
                freqMap1.put(s1.charAt(i), new ArrayList<>(Arrays.asList(i)));
            }

        }

        for (int i=0; i<s2.length(); i++) {
            if (freqMap2.containsKey(s2.charAt(i))) {
                freqMap2.get(s2.charAt(i)).add(i);
            } else {
                freqMap2.put(s2.charAt(i), new ArrayList<>(Arrays.asList(i)));
            }
        }

        System.out.println(freqMap1.values());
        System.out.println(freqMap2.values());
        return freqMap1.values().equals(freqMap2.values());

    }

    public static void main(String[] args) {
        String s1="foo";
        String s2="app";
        System.out.println(areIsomorphic(s1, s2));
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我从印刷品得到的输出:

[[0], [1, 2]]
[[0], [1, 2]]
false
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 5

values()返回一个Collection不覆盖Object的实现equals.因此,您正在比较对象引用而不是Collections 的内容.

您可以通过在调用之前将这些Collections 转换为Lists 来比较它们equals:

new ArrayList<ArrayList<Integer>>(freqMap1.values()).equals(new ArrayList<ArrayList<Integer>>freqMap2.values()))
Run Code Online (Sandbox Code Playgroud)

true仅当两个values() Collections包含相同迭代顺序中的相同元素时,才会返回此选项.如果您不关心订单和重复值,则可以将values() Collections 转换为HashSet而不是ArrayList.现在,无论迭代顺序如何,true如果两者都values() Collection包含相同的唯一元素,您将获得.

在Java 7+中,以下内容可行:

return new ArrayList<>(freqMap1.values()).equals(new ArrayList<>(freqMap2.values()));
Run Code Online (Sandbox Code Playgroud)