即使它们相等,.equal也不适用于列表列表

时间:2016-05-27 05:59:28

标签: java string arraylist hashmap equals

因此,当我检查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));
    }
}

这是我从print获得的输出:

[[0], [1, 2]]
[[0], [1, 2]]
false

2 个答案:

答案 0 :(得分:5)

values()会返回Collection实施,但不会覆盖Object的{​​{1}}。因此,您要比较对象引用而不是equals s。

的内容

您可以在调用Collection之前将这些Collection转换为List来比较它们:

equals

仅当new ArrayList<ArrayList<Integer>>(freqMap1.values()).equals(new ArrayList<ArrayList<Integer>>freqMap2.values())) true包含相同迭代顺序中的相同元素时,才会返回values()。如果您不关心订单和重复值,则可以将Collection values()转换为Collection而不是HashSet。现在,如果ArrayList true包含相同的唯一元素,您将获得values(),无论迭代顺序如何。

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

Collection

答案 1 :(得分:0)

我认为问题可能在于您将List Listequals进行比较。以下解决了我的问题。

    List<ArrayList<Integer>> map1Values = new ArrayList(freqMap1.values());
    List<ArrayList<Integer>> map2Values = new ArrayList(freqMap2.values());        

    if(map1Values.get(i).size() != map2Values.get(i)){
        return false;
    }

    boolean result = true;

    for(int i=0;i<map1Values.size() && result;i++){
        boolean tmp = Objects.equals(map1Values.get(i), map2Values.get(i));
        result = result && tmp;
    }
    return result;