Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java .不等于';即使它们相等,也不能为列表工作_Java_String_Arraylist_Hashmap_Equals - Fatal编程技术网

Java .不等于';即使它们相等,也不能为列表工作

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

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