[英]Why does String equals() return false (custom Comparator involved)?
我构建了一个非常简单的自定义比较器,将其与TreeSet一起使用,以便按该TreeSet中的长度对字符串进行排序。
我很难找到即使两个字符串s1和s2包含相同值时(s1.equals(s2))
返回false的原因。
Eclipse的“变量视图”显示两个字符串中的字母相同,但是“ id”不同,我想这就是equals返回False的原因。 顺便说一句, id=" "
代表什么? 它是某种指向String对象数据的指针吗?
public class MyComparator implements Comparator<String> {
public int compare(String s1, String s2) {
if(s1.length()<s2.length()) return -1;
else if (s1.length()>s2.length()) return 1;
return 0;
else if (s1.equals(s2)) return 0; //?? ALWAYS RETURNS FALSE
else if (s1.toString().equals(s2.toString()))//SAME PROBLEM HERE (test)
else return -1;
}
public boolean equals(String s) {
if (this.equals(s)) return true;
else return false;
}
}
现在在这里使用此自定义比较器:
combinations = new TreeSet<String>(new MyComparator());
我用几个用substring()
方法构建的substring()
填充组合。
由于前面提到的问题,组合包含重复项。
当我为此TreeSet设置NO自定义比较器时,不再有重复项(这就是我想要的),但是它是按字母顺序排序的,这是正常的,但不是我的目的。
如果您要按长度排序但丢弃重复项,则应该可以执行以下操作。
import java.util.TreeSet;
import java.util.Comparator;
import java.util.Arrays;
public class MyComparator implements Comparator<String> {
public int compare(String s1, String s2) {
int s1Length = s1.length();
int s2Length = s2.length();
if (s1Length == s2Length) {
return s1.compareTo(s2);
}
else {
return s1Length - s2Length;
}
}
public static void main(String[] args) {
String[] strings = {"Hello", "Hello", "longer", "1", "477727357235", "hello"};
TreeSet<String> set = new TreeSet<String>(new MyComparator());
set.addAll(Arrays.asList(strings));
// Won't be duplicates with substrings
String s = "Hello World";
set.add(s);
for (int i = 0; i <= s.length(); i++) {
String s1 = s.substring(0, i);
set.add(s1);
}
// Still won't be a duplicate, even if we make a copy of the string.
set.add(new String(s));
System.out.println(set);
}
}
输出: [, 1, H, He, Hel, Hell, Hello, hello, Hello , longer, Hello W, Hello Wo, Hello Wor, Hello Worl, Hello World, 477727357235]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.