Java 8 Comparator链接单个属性的反向

时间:2018-06-18 19:37:48

标签: java sorting java-8 comparator

我使用ComparatorStudent个对象列表进行排序。

我想反转id属性的排序,但使用reverse()方法将其应用于整个排序。

如何只在id上发生?

到目前为止,这是我的代码:

 public List<Student> getStudents(List<String> events) {
    Comparator<Student> comparatorStudents = Comparator.comparing(Student::getCGPA).thenComparing(Student::getName)
      .thenComparingInt(Student::getID).reverse();
    List<Student> students = new ArrayList<Student>();
    //Filling students
    Collections.sort(students, comparatorStudents);
    return students;
  }

3 个答案:

答案 0 :(得分:7)

将最后一位更改为:

.thenComparing(Student::getID, Comparator.reverseOrder())

或者,如果您想避免自动装箱:

.thenComparing(Comparator.comparingInt(Student::getID).reversed())

答案 1 :(得分:2)

reversed()的电话放在var table = $("table#sortable tbody"); var childrens = $(this).closest('tr').attr('data-question-id'); var childrens = $(thisRow).hasClass('parent').attr('data-question-id'); table.find('tr.childrow').each(function (key) { <!--- missing this piece here need to create a comma separated list --> }); 内:

thenComparing

答案 2 :(得分:1)

我喜欢使用Guava's Ordering class进行几乎所有的排序。这里有很好的记录:https://github.com/google/guava/wiki/OrderingExplained

除其他外,我喜欢Ordering,因为:

  1. 它使用“流畅的”API。
  2. 订购实施可比较,因此可以在任何可以使用Comparable的地方使用。
  3. 它们自然是线程安全的(这意味着你可以将它们声明为静态常量并在任何地方重用一个实例)。
  4. 在你的情况下,我会按如下方式编写代码:

    private static final Ordering<Student> BY_GPA = Ordering.natural().onResultOf(Student::getCGPA);
    private static final Ordering<Student> BY_NAME = Ordering.nautural().onResultOf(Student::getName);
    private static final Ordering<Student> BY_ID_DESCENDING = Ordering.natural().reverse().onResultOf(Student::getID);
    
    // I spent approximately zero time coming up with a good name for this constant
    public static final Ordering<Student> STUDENT_ORDER = BY_CPA.compound(BY_NAME).compound(BY_ID_DESCENDING);
    
    public List<Student> getStudents(List<String> events) {
        List<Student> students = new ArrayList<Student>();
        //Filling students
        Collections.sort(students, STUDENT_ORDER);
        return students;
    }
    

    就个人而言,我通常会在Student类中声明这些常量,这样任何与Student个对象交互的人都可以轻松找到并重用他们对它们进行排序所需的内容。在那种情况下,我可能会将公共常量命名为DEFAULT_ORDER或类似的东西,但如果没有更多上下文,我不确定GPA排序是否是您真正想要的默认值。

    您绝对不必声明四个单独的常量 - 三个私有常量绝对可以内联声明。我喜欢这样做,因为我发现它提高了可读性。

    另外:我不确定您对复制的需求是什么,但如果学生保证是独一无二的,并且您对equalshashCode有很好的实施,我会鼓励你使用Set<Student> students = new TreeSet<Student>();。这样,它们会在您添加到集合时进行排序,如果您修改集合,它们会自动保持这种状态。