.equal 不适用于列表列表,即使它们相等
.equal doesn't work for list of list even if they are equal
所以当我检查 freqMap1.values() 和 freqMap2.values() 具有相同的值但是当我用 .equals 检查它时它 returns 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));
}
}
这是我从打印中得到的输出:
[[0], [1, 2]]
[[0], [1, 2]]
false
values()
return 是一个 Collection
实现,不会覆盖 Object
的 equals
。因此,您比较的是对象引用而不是 Collection
的内容。
您可以通过在调用 equals
之前将这些 Collection
转换为 List
来比较它们:
new ArrayList<ArrayList<Integer>>(freqMap1.values()).equals(new ArrayList<ArrayList<Integer>>freqMap2.values()))
仅当两个 values()
Collection
都包含相同迭代顺序的相同元素时,才会 return true
。如果您不关心顺序和重复值,您可以将 values()
Collection
转换为 HashSet
而不是 ArrayList
。现在,如果 values()
Collection
都包含相同的唯一元素,无论迭代顺序如何,您都会得到 true
。
在 Java 7+ 中,以下内容有效:
return new ArrayList<>(freqMap1.values()).equals(new ArrayList<>(freqMap2.values()));
我认为问题可能出在您将 List
的 List
与 equals
进行比较。以下解决了我的问题。
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;
所以当我检查 freqMap1.values() 和 freqMap2.values() 具有相同的值但是当我用 .equals 检查它时它 returns 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));
}
}
这是我从打印中得到的输出:
[[0], [1, 2]]
[[0], [1, 2]]
false
values()
return 是一个 Collection
实现,不会覆盖 Object
的 equals
。因此,您比较的是对象引用而不是 Collection
的内容。
您可以通过在调用 equals
之前将这些 Collection
转换为 List
来比较它们:
new ArrayList<ArrayList<Integer>>(freqMap1.values()).equals(new ArrayList<ArrayList<Integer>>freqMap2.values()))
仅当两个 values()
Collection
都包含相同迭代顺序的相同元素时,才会 return true
。如果您不关心顺序和重复值,您可以将 values()
Collection
转换为 HashSet
而不是 ArrayList
。现在,如果 values()
Collection
都包含相同的唯一元素,无论迭代顺序如何,您都会得到 true
。
在 Java 7+ 中,以下内容有效:
return new ArrayList<>(freqMap1.values()).equals(new ArrayList<>(freqMap2.values()));
我认为问题可能出在您将 List
的 List
与 equals
进行比较。以下解决了我的问题。
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;