Що означають значення повернення Comparable.compareTo у Java?


75

У чому різниця між поверненням 0, повертаючись 1і повертаючись -1в compareTo()в Java?


6
порівнятиTo може також повернути -2, або 42.
Тіло

4
Спробуйте Javadoc деякий час.
user207421

24
якщо у вас є проблеми з запам'ятовуванням (як у мене), я просто уявляю це як операцію віднімання чисел, a-bякщо aбільше, результат позитивний (+1), інакше, якщо bбільше, результат негативний ... якщо вони дорівнює його0
st0le

Відповіді:


93

Офіційне визначення

З довідкових документів Comparable.compareTo (T) :

Порівнює цей об’єкт із зазначеним об’єктом для замовлення. Повертає від'ємне ціле, нуль або додатне ціле число, оскільки цей об'єкт менше, дорівнює або перевищує вказаний об'єкт.

Реалізатор повинен забезпечити sgn (x.compareTo (y)) == -sgn (y.compareTo (x)) для всіх x та y. (Це означає, що x.compareTo (y) повинен видавати виняток, якщо y.compareTo (x) видає виняток.)

Реалізатор також повинен переконатися, що відношення є транзитивним: (x.compareTo (y)> 0 && y.compareTo (z)> 0) передбачає x.compareTo (z)> 0.

Нарешті, реалізатор повинен переконатися, що x.compareTo (y) == 0 означає, що sgn (x.compareTo (z)) == sgn (y.compareTo (z)), для всіх z.

Настійно рекомендується, але суворо не вимагається, щоб (x.compareTo (y) == 0) == (x.equals (y)). Взагалі кажучи, будь-який клас, який реалізує порівняльний інтерфейс і порушує цю умову, повинен чітко вказувати цей факт. Рекомендованою мовою є "Примітка: цей клас має природне впорядкування, яке не відповідає рівним".

У попередньому описі позначення sgn (вираз) позначає математичну функцію signum, яка визначена для повернення одного з -1, 0 або 1 відповідно до того, чи є значення виразу від'ємним, нульовим чи додатним.

Моя версія

Коротко:

this.compareTo(that)

повертається

  • негативний int, якщо this <that
  • 0 якщо це == те
  • позитивний int якщо this> that

де реалізація цього методу визначає фактичну семантику < >та ==(я не маю ==на увазі в сенсі оператора ідентифікації об'єкта Java)

Приклади

"abc".compareTo("def")

дасть щось менше 0, як abcце було в алфавітному порядку раніше def.

Integer.valueOf(2).compareTo(Integer.valueOf(1))

дасть щось більше 0, тому що 2 більше 1.

Деякі додаткові моменти

Примітка: Це хороша практика для класу, який реалізує Comparable, оголосити семантику методу compareTo () у javadocs.

Примітка: слід прочитати принаймні одне з наступного:

Попередження: ви ніколи не повинні покладатися на повертаються значеннях CompareTo істот -1, 0і 1. Ви завжди повинні перевірити x < 0, x == 0, x > 0відповідно.


Пам’ятайте, у документації, про яку вони говорять sgn(), а не безпосередньо -1 та 1. Ви повинні додати це до своєї короткої версії.
Колін Геберт

Я знаю. Я віддаю перевагу справжній мові, ніж математичному мумбо-джамбо (хлопчику, я радий, що ви не можете проголосувати за коментарі :-)), тому я написав -1 (або менше) та 1 (або більше) відповідно.
Шон Патрік Флойд,

1
Цікаво, що офіційні документи жодного разу не говорять, що негативний int насправді означає це <те . Вони просто кажуть, що є три різні значення повернення: від’ємний int, нульовий та позитивний int. Один із них означає це <те , один означає це> те, а один означає це == те . Що є що, документи жодного разу не вказують - насправді, можна сказати, автори наполегливо намагалися написати навколо цієї деталі та залишити її відкритою.
АБО Mapper

@ORMapper Я не згоден. "Повертає від'ємне ціле, нульове або додатне ціле число, оскільки цей об'єкт менше, дорівнює або перевищує вказаний об'єкт." Частина "як цей об'єкт є" відображає цілі числа у відносини.
Шон Патрік Флойд,

1
@kojow Я не стикався з такою реалізацією, але в контракті чітко сказано : "Повертає від'ємне ціле, нульове або додатне ціле число, оскільки цей об'єкт менше, дорівнює або перевищує вказаний об'єкт".
Шон Патрік Флойд

51

Я використовую цю мнемоніку:

a.compareTo(b) < 0 // a < b

a.compareTo(b) > 0 // a > b

a.compareTo(b) == 0 // a == b

Ви зберігаєте знаки і завжди порівнюєте результат з compareTo()0


1
Це ідеально!
mvorisek

Я використовую цю цифрову версію тільки легко запам'ятати: a.compareTo(b) = a - b.
Крадучий кошеня,

@CrouchingKitten a-bніколи не слід використовувати в реалізації compaTo () у реальному коді, оскільки він може (і буде) переповнюватися.
Клімент Черлін

29

Відповідь коротко: (пошук вашої ситуації)

  • 1 .compareTo ( 0 ) ( повернення : 1 )
  • 1 .compareTo ( 1 ) ( return : 0 )
  • 0 .comapreTo ( 1 ) ( повернення : -1 )

2
Чудова відповідь для швидкого ознайомлення.
Джузер Алі

5

візьмемо приклад, якщо ми хочемо порівняти "a" і "b", тобто ("a" == це)

  1. від’ємний int, якщо a <b
  2. якщо a == b
  3. Позитивний int, якщо a> b

3

Його можна використовувати для сортування, і 0 означає "рівний", тоді як -1, а 1 означає "менше" та "більше (більше)".

Будь-яке значення, яке повертається, менше ніж 0, означає, що лівий операнд менший, а якщо значення більше 0, то лівий операнд більший.


2
Це мінус, позитив і 0, а не просто -1, 1 і 0
Колін Геберт

Колін, там було -1, 0 та 1 під питанням. І так, хоча деякі компаратори повертають лише одне з цих значень, інші можуть повертати будь-яке значення, де негатив означає, що лівий операнд менший, нуль означає, що обидва операнди рівні, а позитивний означає, що лівий більший. За межами землі Java це як strcmp()з C працює.
Міхал Ніклас,

2
int x = thisObject.compareTo(anotherObject);

compareTo()Метод повертає Int з наступними характеристиками:

  • негативний If thisObject < anotherObject
  • нуль If thisObject == anotherObject
  • позитивні If thisObject > anotherObject

0

System.out.println (A.compareTo (B)> 0? "Так": "Ні")

якщо значення A> B, воно поверне "Так" або "Ні".


1
Як ви вважаєте, чи відповідає ваша відповідь на запитання?
Прасант Раджендран,

1
Будь ласка, додайте пояснення до своєї відповіді, щоб інші могли навчитися з цього
Ніко Хаасе,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.