Сравнить в компараторах - PullRequest
       27

Сравнить в компараторах

0 голосов
/ 01 декабря 2019

У меня есть вопрос относительно того, как функция CompareTo помогает компараторам в отношении упорядочения, например, o1.compareTo (o2) vs o2.compareTo (o1)

Если обе строки равны, тогда этометод возвращает 0, иначе он возвращает положительное или отрицательное значение. Результат будет положительным, если первая строка лексикографически больше второй строки, в противном случае результат будет отрицательным.

Вышеприведенное утверждение является простым, но как получается, что o1.compareTo (o2) дастмне порядок возрастания, тогда как o2.compareTo (o1) дает мне порядок убывания?

Если у меня целочисленные значения '5,10,3', я получу 3,5,10 с o1.compareTo (o2) иобратное для последнего

String str1 = "Negan";  
String str2 = ""; //empty string

//it would return the length of str1 in positive number
str1.compareTo(str2); // 5

//it would return the length of str1 in negative number
str2.compareTo(str1); //-5

Следуя этой логике с приведенным выше кодом для str1.compareTo (str2), у меня должен быть порядок возрастания, когда после него идут лексографически большие числа, но что происходит, если приходит str1так как "" и str2 это "Неган". Есть ли какое-то правило, устанавливаемое, когда 1 сравнивается с 2 -> означает, что если значение отрицательное, поместите его в начало и, если оно положительное, поместите его в конец? В качестве альтернативы, если CompareTo - это str2.compareTo (str1), если значение является отрицательным, поместите его в конец и, если оно положительное, поместите его в начало, при этом учитывается упорядочение параметров (str1, str2) против(str2, str1), где соответствующие заказы CompareTo будут выполнять то же действие, только что str1.compareTo (str2) = str2.compareTo (str1).

Редактировать: просто, как возвращаемое значение определяетпозиционирование, если параметры являются взаимозаменяемыми и в двоичных формах, будет выполнять одно и то же действие.

1 Ответ

3 голосов
/ 01 декабря 2019

a.compareTo(b) меньше нуля, если a < b, что вы можете прочитать как «а до б». a.compareTo(b) больше нуля, если a > b, то есть «a находится после b».

То есть, CompareTo вызывается для одного из объектов, с другим объектом в качестве аргумента. Его роль заключается в том, чтобы сообщать, является ли этот объект меньше / равен / больше объекта аргумента.

Обратите внимание, что a.compareTo(b) равно - b.compareTo(a).

Теперь для компаратора. Comparator.compare(a, b) должен сообщать об упорядочении 'a' и 'b' и поэтому должен (для возрастающего порядка) вызывать a.compareTo(b), а не b.compareTo(a) - потому что первое приводит к правильному результату отрицательного значения, еслиa перед b, строго положительно, если a после b.

Итак, если вы напишите свой компаратор так, что compare(a, b) вызывает a.compareTo(b), вы получите восходящий порядок;если он вызывает b.compareTo(a), вы получите нисходящий порядок.

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