亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么當 Comparator.compare 相等時我們需要返回 0

為什么當 Comparator.compare 相等時我們需要返回 0

ABOUTYOU 2023-09-27 17:11:56
我知道當實現Comparator接口的compare方法時我們需要返回如果 o1 > o2,+1-1 如果 o1 < o20 如果 o1 == o2我的問題是為什么當兩者相等時我們需要返回 0?用例是什么或在哪里使用?如果我們考慮當o2大于o1或o2等于o1時排序不會改變它的位置。誰能來解釋一下實際用例嗎?Java 文檔說比較其兩個參數的順序。當第一個參數小于、等于或大于第二個參數時,返回負整數、零或正整數。這是否意味著 return -1 或 return 0 具有相同的影響?零或正整數 @Override    public int compare(Test f1, Test f2) {        if (f1.getId() > f2.getId()) {            return 1;        } else if (f1.getId() < f2.getId()) {            return -1;        } else {            return 0;        }    }
查看完整描述

3 回答

?
ITMISS

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;

        }

    }

  }

}


查看完整回答
反對 回復 2023-09-27
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

如果當比較的兩個值相等時返回 -1,compare(f1,f2)并且compare(f2,f1)都將返回-1。這意味著元素的順序將不一致。它可能會破壞一些排序算法。

這就是為什么總合同compare要求:

sign(compare(f1,f2)) = -sign(compare(f2,f1))

這意味著當兩個值相等時必須返回 0。


查看完整回答
反對 回復 2023-09-27
?
小唯快跑啊

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)。我希望這有幫助。


查看完整回答
反對 回復 2023-09-27
  • 3 回答
  • 0 關注
  • 311 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號