Java .不等于';即使它们相等,也不能为列表工作
因此,当我检查freqMap1.values()和freqMap2.values()时,它们的值相同,但当我用.equals检查时,它返回false。我对如何解决这个问题感到困惑:Java .不等于';即使它们相等,也不能为列表工作,java,string,arraylist,hashmap,equals,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 stati
/**
* 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));
}
}
values()
返回一个集合
实现,该实现不会覆盖对象
的等于
。因此,您正在比较对象引用,而不是集合的内容
在调用equals
之前,您可以通过将这些集合
转换为列表
s来比较它们:
new ArrayList<ArrayList<Integer>>(freqMap1.values()).equals(new ArrayList<ArrayList<Integer>>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;
List map1Values=new ArrayList(freqMap1.values());
List map2Values=newarraylist(freqMap2.values());
if(map1Values.get(i).size()!=map2Values.get(i)){
返回false;
}
布尔结果=真;
对于(int i=0;iMona,您可能会发现您的乐趣对于keyset()比较也是如此。@ShivV不,不是。keyset()
返回AbstractSet
的子类的实例,该子类覆盖等于,因此您可以比较keyset()返回的Set
s
与等于。我很抱歉。你说得对。@AndyTurner我不确定。那部分是OP添加的,不是我添加的。@Eran我使用的是Java 8,这就是我为什么用Java 8编写它的原因。我统计了其中至少4个bug,其中3个bug可以通过使用map1Values.equals(map2.values())修复
而不是for循环。是的,我认为result
返回的是上一次赋值的逻辑值,并修复了这个问题。其他3个错误是什么?1)List map2Values=new arrarylist(freqMap1.values())代码>-您使用的是freqMap1
而不是freqMap2
。2)您没有检查列表的大小是否相同,因此您将无法比较所有元素,或者获取ArrayIndexOutOfBoundsException
,具体取决于哪个列表更大。3)您将map1Values.get(i)
与map1Values.get(i)
,这显然是正确的(除非map1Values.get(i)
为空,否则IWC将获得NullPointerException
)。
return new ArrayList<>(freqMap1.values()).equals(new ArrayList<>(freqMap2.values()));
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;