3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)您排序時(shí),-1和0本質(zhì)上對排序列表的排序有非常相似的影響,因?yàn)樵u估compareTo為 0 的項(xiàng)目將被分組在一起。
您“實(shí)際上”會(huì)在其他場景中使用此比較,例如您可能不想將復(fù)雜對象重復(fù)添加到列表中(是的,您也可以通過使用 a 來實(shí)現(xiàn)此場景)set。
假設(shè)我們有一個(gè)對象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 以創(chuàng)建自定義比較,首先檢查書籍的 isbn,然后檢查其標(biāo)題。
假設(shè)(例如)您有一個(gè)圖書館,里面有書籍。您可能想阻止您的用戶在該圖書館中添加重復(fù)的書籍......
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貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
如果當(dāng)比較的兩個(gè)值相等時(shí)返回 -1,compare(f1,f2)
并且compare(f2,f1)
都將返回-1
。這意味著元素的順序?qū)⒉灰恢?。它可能?huì)破壞一些排序算法。
這就是為什么總合同compare
要求:
sign(compare(f1,f2)) = -sign(compare(f2,f1))
這意味著當(dāng)兩個(gè)值相等時(shí)必須返回 0。

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