在 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 不同的字符串,您可以通过打印它们或通过调试代码找到它们。这种差异背后的原因是 sArray
和 tArray
的哈希码不同。检查 What is a debugger and how can it help me diagnose problems? 以了解如何使用调试器来避免此类情况。
当我尝试将两个字符串作为函数的输入并检查它们是否是变位词时,我得到了错误的输出。我写了下面的代码。
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 不同的字符串,您可以通过打印它们或通过调试代码找到它们。这种差异背后的原因是 sArray
和 tArray
的哈希码不同。检查 What is a debugger and how can it help me diagnose problems? 以了解如何使用调试器来避免此类情况。