0
public static final  Comparator<Summary> COMPARATOR = (courseModel1, courseModel2) -> {
    
    if (courseModel1.department.compareTo(courseModel2.department) > 0) {
      return courseModel1;
    }
    if (courseModel1.department.compareTo(courseModel2.department) < 0) {
      return courseModel2;
    }
    if (courseModel1.department.compareTo(courseModel2.department) == 0) {
      if (courseModel1.number.compareTo(courseModel2.number) > 0) {
        return courseModel1;
      }
      if (courseModel1.number.compareTo(courseModel2.number) < 0) {
        return courseModel2;
      }
      if (courseModel1.number.compareTo(courseModel2.number) == 0) {
        if (courseModel1.title.compareTo(courseModel2.title) > 0) {
          return courseModel1;
        }
        if (courseModel1.title.compareTo(courseModel2.title) < 0) {
          return courseModel2;
        }
      }
    }
    // (ERROR: missing a return statement here)
  };
4

2 回答 2

2

方法比较的文档中所述

返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。

所以你的代码需要返回一个整数而不是对象。如果第一个参数小于第二个,返回-1,如果第一个参数大于第二个,返回1,如果对象相等返回0。目前,它正在返回参数之一。

编译错误的原因missing a return statement是缺少分支,您的代码可以if/else用来确保覆盖所有分支,而不仅仅是ifs,或者在末尾添加默认返回值。

编辑,下面有更详细的信息:
在此处输入图像描述 如果if蓝色箭头指向的是错误的会发生什么?没有代码可以表明它。

于 2020-11-02T02:20:46.370 回答
0

首先,比较器返回int描述两个对象之间的关系。它们不返回比较对象。

因此,您可能希望按如下方式简化比较器。这首先检查是否相等(== 0)。如果不相等,则根据后续比较返回 -1 或 1(它必须是一个或另一个)。否则,继续下一个测试并检查数字是否相等,如果相等,则返回比较标题的数字结果,不管。它看起来像这样。

Comparator<Summary> COMPARATOR =
        (courseModel1, courseModel2) -> {

            if (courseModel1.department.compareTo(
                    courseModel2.department) != 0) {
                return courseModel1.department
                        .compareTo(courseModel2.department);
            }
            
            if (courseModel1.number
                    .compareTo(courseModel2.number) != 0) {
                return courseModel1.number
                        .compareTo(courseModel2.number);
            }
            // in the last case, just return the overall comparison (-1,0, or 1).
            return courseModel1.title
                    .compareTo(courseModel2.title);
        };

但这可以通过使用Comparator接口提供的方法进一步简化。在每种情况下,它都会返回比较基于哪个小或大的汇总字段的结果。如果它们相等,则比较器将尝试数字,然后是标题。

Comparator<Summary> comp =
        Comparator.comparing(Summary::getDepartment)
                .thenComparing(Summary::getNumber)
                .thenComparing(Summary::getTitle);

无论比较器的形式如何,您都可以这样使用它。

Summary sum1 = ...
Summary sum2 = ...
int  cmp = COMPARATOR.compare(sum1,sum2);
if (cmp < 0) {
   // do something with sum1.
} else if (cmp > 0) {
  // do something with sum2.
} else {
  // take some action as required.
}

被比较的班级

class Summary {
    public String department;
    public String title;
    public Integer number;
    public String getDepartment() {
        return department;
    }
    
    public String getTitle() {
        return title;
    }
    
    public Integer getNumber() {
        return number;
    }
}
于 2020-11-02T02:24:12.390 回答