Các giá trị trả về của Comp Compare.compareTo có nghĩa là gì trong Java?


75

Sự khác biệt giữa trở về là gì 0, trở về 1và trở về -1trong compareTo()trong Java?


6
Tuy nhiên, so sánhTo cũng có thể trả về -2 hoặc 42.
Thilo

4
Hãy thử Javadoc một thời gian.
user207421 22/09/10

24
nếu bạn gặp khó khăn khi nhớ, (giống như tôi), tôi chỉ đơn giản tưởng tượng nó là một phép toán trừ số a-bnếu alớn hơn, kết quả là dương (+1) khác, nếu blớn hơn, kết quả là âm ... nếu chúng bằng nó0
st0le

Câu trả lời:


93

Định nghĩa chính thức

Từ tài liệu tham khảo của Comp Compare.compareTo (T) :

So sánh đối tượng này với đối tượng được chỉ định để đặt hàng. Trả về một số nguyên âm, không hoặc một số nguyên dương vì đối tượng này nhỏ hơn, bằng hoặc lớn hơn đối tượng đã chỉ định.

Người triển khai phải đảm bảo sgn (x.compareTo (y)) == -sgn (y.compareTo (x)) cho mọi x và y. (Điều này ngụ ý rằng x.compareTo (y) phải ném một ngoại lệ. Y.compareTo (x) ném một ngoại lệ.)

Người triển khai cũng phải đảm bảo rằng quan hệ có tính bắc cầu: (x.compareTo (y)> 0 && y.compareTo (z)> 0) ngụ ý x.compareTo (z)> 0.

Cuối cùng, trình triển khai phải đảm bảo rằng x.compareTo (y) == 0 ngụ ý rằng sgn (x.compareTo (z)) == sgn (y.compareTo (z)), cho tất cả z.

Chúng tôi thực sự khuyến khích, nhưng không bắt buộc nghiêm ngặt rằng (x.compareTo (y) == 0) == (x.equals (y)). Nói chung, bất kỳ lớp nào triển khai giao diện So sánh được và vi phạm điều kiện này phải chỉ ra rõ ràng thực tế này. Ngôn ngữ được đề xuất là "Lưu ý: lớp này có thứ tự tự nhiên không phù hợp với bằng".

Trong mô tả ở trên, ký hiệu sgn (biểu thức) chỉ định hàm ký hiệu toán học, được xác định để trả về một trong các -1, 0 hoặc 1 tùy theo giá trị của biểu thức là âm, 0 hay dương.

Phiên bản của tôi

Nói ngắn gọn:

this.compareTo(that)

trả lại

  • một số nguyên âm nếu cái này <cái kia
  • 0 nếu cái này == cái kia
  • một int dương nếu cái này> cái đó

trong đó việc triển khai phương thức này xác định ngữ nghĩa thực tế của < >==(ý tôi không phải là ==toán tử nhận dạng đối tượng của java)

Ví dụ

"abc".compareTo("def")

sẽ mang lại giá trị nhỏ hơn 0 theo abcthứ tự bảng chữ cái trước đó def.

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

sẽ mang lại giá trị lớn hơn 0 vì 2 lớn hơn 1.

Một số điểm bổ sung

Lưu ý: Một phương pháp hay đối với một lớp thực hiện So sánh là khai báo ngữ nghĩa của phương thức CompareTo () của nó trong javadocs.

Lưu ý: bạn nên đọc ít nhất một trong những điều sau:

Cảnh báo: bạn không nên dựa vào các giá trị trả về của CompareTo being -1, 01. Bạn nên thường xuyên kiểm tra x < 0, x == 0, x > 0, tương ứng.


Hãy nhớ rằng, trong tài liệu họ nói về sgn(), không trực tiếp -1 và 1. Bạn nên thêm điều này vào phiên bản ngắn của mình.
Colin Hebert

Tôi biết. Tôi thích ngôn ngữ thực hơn mumbo-jumbo toán học (cậu bé, tôi rất vui vì bạn không thể phản đối bình luận :-)), vì vậy tôi đã viết -1 (hoặc nhỏ hơn)1 (hoặc lớn hơn) , tương ứng.
Sean Patrick Floyd

1
Điều thú vị là các tài liệu chính thức nói tại không có điểm rằng một int tiêu cực thực sự có nghĩa này <rằng . Họ chỉ nói rằng có ba giá trị trả về riêng biệt: số nguyên âm, số không và số nguyên dương. Một trong số chúng có nghĩa là this <that , một nghĩa là this> that và một có nghĩa là this == that . Đó là điều gì, các tài liệu không chỉ rõ ở bất kỳ điểm nào - trên thực tế, bạn có thể nói, các tác giả đã rất cố gắng viết về chi tiết đó và bỏ ngỏ.
HOẶC Mapper

@ORMapper Tôi không đồng ý. "Trả về số nguyên âm, không hoặc số nguyên dương vì đối tượng này nhỏ hơn, bằng hoặc lớn hơn đối tượng đã chỉ định." Phần "as this object is" ánh xạ các số nguyên thành các quan hệ.
Sean Patrick Floyd

1
@kojow Tôi chưa bắt gặp cách triển khai như vậy, nhưng hợp đồng có ghi rõ ràng : "Trả về số nguyên âm, số 0 hoặc số nguyên dương vì đối tượng này nhỏ hơn, bằng hoặc lớn hơn đối tượng được chỉ định."
Sean Patrick Floyd

51

Tôi sử dụng cách ghi nhớ này:

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

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

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

Bạn giữ các dấu hiệu và luôn so sánh kết quả của compareTo()với 0


1
Đây là hoàn hảo!
mvorisek

Tôi sử dụng phiên bản số chỉ này để nhớ một cách dễ dàng: a.compareTo(b) = a - b.
Crouching Kitten vào

@CrouchingKitten a-bkhông bao giờ được sử dụng trong việc triển khai CompareTo () trong mã thực, vì nó có thể (và sẽ) làm tràn.
Clement Cherlin

29

Trả lời ngắn gọn: (tìm kiếm tình huống của bạn)

  • 1 .compareTo ( 0 ) ( trả về : 1 )
  • 1 .compareTo ( 1 ) ( trả về : 0 )
  • 0 .comapreTo ( 1 ) ( trả về : -1 )

2
Câu trả lời tuyệt vời để tham khảo nhanh chóng.
Juzer Ali

5

lấy ví dụ nếu chúng ta muốn so sánh "a" và "b", tức là ("a" == this)

  1. int âm nếu a <b
  2. nếu a == b
  3. Số nguyên dương nếu a> b

3

Nó có thể được sử dụng để sắp xếp và 0 có nghĩa là "bằng nhau" trong khi -1 và 1 có nghĩa là "ít hơn" và "nhiều hơn (lớn hơn)".

Bất kỳ giá trị trả về nào nhỏ hơn 0 có nghĩa là toán hạng bên trái nhỏ hơn và nếu giá trị lớn hơn 0 thì toán hạng bên trái sẽ lớn hơn.


2
Đó là tiêu cực, tích cực và 0, không phải đơn giản, 1 và 0 -1
Colin Hebert

Colin, có -1, 0 và 1 trong câu hỏi. Và có, trong khi một số bộ so sánh chỉ trả về một trong những giá trị đó, thì bộ so sánh khác có thể trả về bất kỳ giá trị nào, trong đó âm nghĩa là toán hạng bên trái nhỏ hơn, số 0 có nghĩa là cả hai toán hạng bằng nhau và dương nghĩa là bên trái lớn hơn. Bên ngoài vùng đất Java giống như strcmp()từ C hoạt động.
Michał Niklas

2
int x = thisObject.compareTo(anotherObject);

Các compareTo()phương thức trả về một giá trị int với các đặc điểm sau:

  • tiêu cực If thisObject < anotherObject
  • số không If thisObject == anotherObject
  • tích cực If thisObject > anotherObject

0

System.out.println (A.compareTo (B)> 0? "Có": "Không")

nếu giá trị của A> B nó sẽ trả về "Có" hoặc "Không".


1
Bạn có nghĩ rằng câu trả lời của bạn phù hợp với câu hỏi?
Prasanth Rajendran

1
Vui lòng thêm một số giải thích cho câu trả lời của bạn như vậy mà những người khác có thể học hỏi từ nó
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.