3 回答

TA貢獻1871條經驗 獲得超8個贊
當您排序時,-1和0本質上對排序列表的排序有非常相似的影響,因為評估compareTo為 0 的項目將被分組在一起。
您“實際上”會在其他場景中使用此比較,例如您可能不想將復雜對象重復添加到列表中(是的,您也可以通過使用 a 來實現此場景)set。
假設我們有一個對象Book如下:
import java.util.Comparator;
public class Book implements Comparable {
String isbn;
String title;
public Book(String id, String title) {
this.isbn = id;
this.title = title;
}
String getIsbn() {
return isbn;
}
String getTitle() {
return title;
}
@Override
public int compareTo(Object o) {
return Comparator
.comparing(Book::getIsbn)
.thenComparing(Book::getTitle)
.compare(this, (Book) o);
}
@Override
public String toString() {
String output = new StringBuilder()
.append(isbn).append(":").append(title)
.toString();
return output;
}
}
在這里,我們重寫了compareToof book 以創建自定義比較,首先檢查書籍的 isbn,然后檢查其標題。
假設(例如)您有一個圖書館,里面有書籍。您可能想阻止您的用戶在該圖書館中添加重復的書籍......
public class Library {
public static void main(String [] args) {
List<Book> library = new ArrayList<>();
library.add(new Book("9780593098240", "Children of Dune"));
library.add(new Book("9780593098233", "Dune Messiah"));
library.add(new Book("9780441172719", "Dune"));
// Just to show the sorting, based on multiple attributes.
Collections.sort(library);
System.out.println("Books in library: " + Arrays.toString(library.toArray()));
// You would obviously have some code for entering a book here, but easier to just create the object for an example.
Book newBook = new Book("9780593098240", "Children of Dune");
for (Book bookInLibrary : library) {
if (bookInLibrary.compareTo(newBook) == 0) {
System.out.println("We already have that book in the library.");
break;
}
}
}
}

TA貢獻1827條經驗 獲得超9個贊
如果當比較的兩個值相等時返回 -1,compare(f1,f2)
并且compare(f2,f1)
都將返回-1
。這意味著元素的順序將不一致。它可能會破壞一些排序算法。
這就是為什么總合同compare
要求:
sign(compare(f1,f2)) = -sign(compare(f2,f1))
這意味著當兩個值相等時必須返回 0。

TA貢獻1863條經驗 獲得超2個贊
您可以考慮具有以下實現的二分搜索算法:
function binary_search(A, n, T):
? ? L := 0
? ? R := n ? 1
? ? while L <= R:
? ? ? ? m := floor((L + R) / 2)
? ? ? ? if A[m] < T:
? ? ? ? ? ? L := m + 1
? ? ? ? else if A[m] > T:
? ? ? ? ? ? R := m - 1
? ? ? ? else:
? ? ? ? ? ? return m
? ? return unsuccessful
假設有一個Comapator對于相等和更少的情況返回相同的值:
public int compare(Test f1, Test f2) {
? ? ? ? if (f1.getId() > f2.getId()) {
? ? ? ? ? ? return 1;
? ? ? ? } else {
? ? ? ? ? ? return -1;?
}
現在A[m] < T或A[m].compareTo(T) < 0,將是true當T等于A[m]和當A[m]小于時T。
所以在這種情況下:
1 2 3 4 // array and A[m] is 2
2 // target T
2.compareTo(2)返回-1使得算法進入下一次執行L = m + 1 -> 而不是返回正確的值。
事實上,二分查找會陷入不定式循環,從 2.compareTo(2)and跳轉3.compareTo(2)。我希望這有幫助。
添加回答
舉報