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)
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)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |