Почему String equals () возвращает false (используется собственный компаратор)? - PullRequest
0 голосов
/ 19 октября 2010

Я создал очень простой пользовательский Comparator, который я использую с TreeSet для сортировки строк по длине в этом TreeSet.

У меня проблемы с поиском причины, по которой (s1.equals(s2)) возвращает false, даже если две строки s1 и s2 содержат одно и то же значение.

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, дубликатов больше нет (это то, что я хочу), но они отсортированы по алфавиту, что является нормальным, но не моей целью.

1 Ответ

2 голосов
/ 19 октября 2010

Если вы пытаетесь отсортировать по длине, но отбрасываете дубликаты, должно работать следующее:

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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...