在 toString() 方法之后使用时 equals() 方法的问题

problem with equals() method when used after toString() method

当我尝试将两个字符串作为函数的输入并检查它们是否是变位词时,我得到了错误的输出。我写了下面的代码。

    class Solution {
    public boolean isAnagram(String s, String t) {
        char sArray[] = s.toCharArray();
        char tArray[] = t.toCharArray();
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        s = sArray.toString();
        t = tArray.toString();
        return s.equals(t);
        
    }
}

我采用的示例输入是 s = "anagram" and t = "nagaram" 。选中时,两个 char 数组都打印相同的值,即

sArray is: 
aaagmnr
tArray is: 
aaagmnr

但我的输出似乎是错误的。有人可以帮助我为什么在 toString() 之后使用 equals() 时会得到这样的结果?

您对 String 的转换不正确,因为数组不会覆盖 toString()Object 实现。

也就是说,没有理由将数组转换为 String 来比较它们。您可以使用 Arrays.equals 直接比较它们,这将 return true if both arrays contain the same number of elements, and all corresponding pairs of elements in the two arrays are equal.

char sArray[] = s.toCharArray();
char tArray[] = t.toCharArray();
Arrays.sort(sArray);
Arrays.sort(tArray);
return Arrays.equals(sArray,tArray);

下面的代码行没有将 char 数组转换为 String:

s = sArray.toString();
t = tArray.toString();

这只会将地址转换为字符串,为了将数组转换为字符串,您应该使用:Arrays.toString(arrName)

现在代码将如下所示:

public static boolean isAnagram(String s, String t) {
    char sArray[] = s.toCharArray();
    char tArray[] = t.toCharArray();
    Arrays.sort(sArray);
    Arrays.sort(tArray);
    s = Arrays.toString(sArray);
    t = Arrays.toString(tArray);
    return s.equals(t);  
}

在这里,toString() 在 char 数组上调用了从对象 class 继承的 toString() 方法,即:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

因此,使用String.valueOf再次将字符数组转换为字符串

s = String.valueOf(sArray);
t = String.valueOf(tArray);

由于只需要比较,可以直接使用Arrays.equals()

比较字符数组
return Arrays.equals(sArray,tArray);

您正在比较

中 sArray 和 tArray 的内存地址
    s = sArray.toString();
    t = tArray.toString();

我建议你循环遍历数组中的值并将其存储在字符串中。

    for( int i = 0; i < sArray.length; i++ )
        str += sArray[i];

    for( int i = 0; i < tArray.length; i++ )
        str2 += tArray[i];

然后这样比较:

return str.equals(str2);

您可以使用 public String(char[] value)char[] 中创建一个 String,例如

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        System.out.println(isAnagram("anagram", "nagaram"));
    }

    public static boolean isAnagram(String s, String t) {
        char sArray[] = s.toCharArray();
        char tArray[] = t.toCharArray();
        Arrays.sort(sArray);
        Arrays.sort(tArray);
        s = new String(sArray);// Create String out of sArray
        t = new String(tArray);// Create String out of tArray
        return s.equals(t);
    }
}

输出:

true

或者,您可以使用 String#valueOf to create a String out of the char[]. There are many more solutions (e.g. comparing the char arrays directly using Arrays#equals,将一个数组的每个元素与另一个数组的每个元素进行比较等),我建议您为了学习目的尽可能多地尝试。

你的方法出了什么问题?

sArray.toString()tArray.toString() return 不同的字符串,您可以通过打印它们或通过调试代码找到它们。这种差异背后的原因是 sArraytArray 的哈希码不同。检查 What is a debugger and how can it help me diagnose problems? 以了解如何使用调试器来避免此类情况。