为什么String equals()返回false(涉及自定义比较器)?

问题描述:

我构建了一个非常简单的自定义Comparator,与TreeSet一起使用,以便在该TreeSet中按字符串排序字符串。为什么String equals()返回false(涉及自定义比较器)?

即使两个字符串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()方法建造。

由于前面提到的问题,组合包含重复项。

当我为此TreeSet设置NO自定义比较器时,不再有任何重复(这是我想要的),但它按字母顺序排序,这是正常的,但不是我的目的。

+0

不会将您的equals()实现陷在无限循环? – 2010-10-18 22:34:21

+0

你能详细说明你想让比较器做什么吗?我不清楚你想要完成什么样的事情。也许发布一些示例输出排序数据。 – 2010-10-18 23:47:10

+0

你可能也想看看使用compareTo String方法。 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)编辑:链接不能正确解析,因为“)”在结束,但您可以在该页面上找到compareTo。 – 2010-10-19 01:07:43

如果你想要做的是按长度排序,但丢弃重复,下面应该工作。

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]

+0

你是绝对正确的!谢谢。 与您的代码相比,我的比较方式相当难看。但无论如何,我还没有捕捉到它为什么不起作用... – 2010-10-19 12:42:15

+0

你能给我们一些不匹配的示例词吗?我试过你的代码,它似乎工作。你不需要在字符串上调用toString,因为它们已经是字符串了。但如果你这样做,它不会伤害任何东西。但它使你的第二个比较string.equals不必要...如果他们toStrings不相等,他们是不相等的。而且你不需要这样做 - 只要返回它们相等的结果(就像我所做的那样)。 – I82Much 2010-10-19 13:19:37

+0

我还没有独立测试过我的小车类,但是只用它与字符串输入生成的“组合生成器”方法,我用它来查找单词的字典。 您可以通过查看插入到最初问题中的图像来获取有关导致问题的示例字符串的更多详细信息:http://yfrog.com/2rvariablesproblemj – 2010-10-20 11:57:13