なぜ我々はComparator.compareが等しくなるとき0を返す必要があります

デレク・ノーブル:

私は、コンパレータの比較メソッドを実装するとき、我々は返す必要があることを理解インタフェース

  • 1もしO1> O2
  • -1であれば01 <O2
  • 0であればO1 O2 ==

我々は両方が等しいときは0を返す必要がなぜ私の質問はありますか?ユースケースや場所、それが使用されては何ですか?O1またはO2よりもO2大きいが01に等しいときに我々は、ソートと考えた場合、それに場所を変更しません。誰もがこのための実用的なユースケースを説明する来ることができますか?

Javaドキュメントは述べています

オーダーのために2つの引数を比較します。戻り負の整数、ゼロ、または正の整数を最初の引数に等しい、未満であるか、または第二のより大きいとして。

この平均リターン-1または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;
        }

    }
Ambro-R:

あなたは、ソートされている場合は-10基本的項目として分類されたリストの順序に非常によく似た影響持たcompareTo0と評価されるだけで一緒にグループ化されます。

あなたは、「実質的に」など、あなたが(はい、あなたもを使用してこのシナリオを実現することができ、リストに複雑なオブジェクトの追加複製したくない場合があります場合など他のシナリオでこの比較を使用する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カスタムブック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;
        }
    }
  }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313659&siteId=1