gpt4 book ai didi

java - 为什么当 Comparator.compare 相等时我们需要返回 0

转载 作者:行者123 更新时间:2023-12-03 23:14:54 24 4
gpt4 key购买 nike

我知道当实现 Comparator 接口(interface)的比较方法时,我们需要返回

  • +1 如果 o1 > o2
  • -1 如果 o1 < o2
  • 0 如果 o1 == o2

  • 我的问题是为什么我们需要在两者相等时返回 0?用例是什么或在哪里使用?
    如果我们考虑排序时 o2 大于 o1 或 o2 等于 o1 不会改变它的位置。
    任何人都可以来解释这个实际用例吗?

    Java 文档说

    Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.



    这是否意味着 return -1 或 return 0 具有相同的影响?

    zero, or a positive integer



     @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;
    }

    }

    最佳答案

    排序时, -1 0 本质上,对排序列表的排序的影响与 compareTo 的项目非常相似。评估为 0 只会被组合在一起。

    您将“实际地”在其他场景中使用此比较,例如您可能不想重复将复杂对象添加到列表中(是的,您也可以通过使用 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;
    }
    }

    在这里,我们覆盖了 compareTo of 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;
    }
    }
    }
    }

    关于java - 为什么当 Comparator.compare 相等时我们需要返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58267950/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com