簡體   English   中英

在 Java 集合排序中使用 Comparator 接口比較方法的返回值 -1、0、1 究竟是什么意思?

[英]What does return value -1, 0, 1 means exactly in Java collection sort with Comparator interface compare method?

我的理解
如果返回值為 0,則無事可做。 如果是-1,那么這兩個值將被掃描。 如果我們想改變順序(asc/desc),只需改變比較運算符。
我在網站上找到的
返回值將是 -1、0 或 1,因為第一個參數小於、等於或大於第二個參數。
我想知道的
為什么我們需要返回值 1? 我在沒有返回值 1 的情況下測試了我的程序,並且它排序正確。

以下程序按年級升序對學生對象進行排序。 如果要更改排序順序,請更改比較運算符。

import java.util.*;
public class HelloWorld {
  public static void main(String[] args) {
    Student s1 = new Student("JJJ", 5);
    Student s2 = new Student("DDD", 2);
    Student s3 = new Student("RRR", 4);
    Student s4 = new Student("CCC", 4);
    Student s5 = new Student("GGG", 3);
    Student s6 = new Student("JJJ", 1);
    List < Student > ls = new ArrayList < > ();
    ls.add(s1);
    ls.add(s2);
    ls.add(s3);
    ls.add(s4);
    ls.add(s5);
    ls.add(s6);
    for (Student s: ls) {
      s.print();
    }
    System.out.println("=====================");
    ls.sort(new Comparator < Student > () {
      @Override
      public int compare(Student s1, Student s2) {
        if (s1.grade < s2.grade) return -1;
        // else if (s1.grade > s2.grade) return 1;
        else return 0;
      }
    });
    for (Student s: ls) {
      s.print();
    }
  }
  public static void printLs(List < Student > ls) {
    for (Student s: ls) {
      s.print();
    }
  }
}
class Student {
  String name;
  int grade;

  Student(String name, int grade) {
    this.name = name;
    this.grade = grade;
  }

  void print() {
    System.out.println(this.name + " - " + this.grade);
  }
}

如果是-1,那么這兩個值將[交換]

不必要。 這取決於排序代碼調用回調的兩個元素。 可能返回-1不會使其交換它們,但返回1會。

我在沒有返回值 1 的情況下測試了我的程序,並且它排序正確。

您剛剛對您正在排序的特定數據感到幸運,這發生在排序代碼使用的特定算法不需要您的回調是准確的。 對於其他數據,它將無法正常工作,因為else if ,當它們相同時,您將返回0 (這兩個相同),因為s1將在s2之后。

不要試圖猜測文檔告訴你什么,或者sort的具體實現是如何工作的。 正確實現回調,使其返回負數、零或正數,具體取決於應如何對給定的兩個元素進行排序。

我已經修改了您的代碼以在開始時生成更多數據,以證明您的數據集太小而無法顯示問題。

您可以在Coding Ground上查看並運行它。 (我不隸屬)

不要依賴抽象的排序調用來始終使用相同的排序實現。 它可以根據數據集的大小調用不同的策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM