我使用Comparator
对Student
个对象列表进行排序。
我想反转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;
}
答案 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
,因为:
在你的情况下,我会按如下方式编写代码:
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排序是否是您真正想要的默认值。
您绝对不必声明四个单独的常量 - 三个私有常量绝对可以内联声明。我喜欢这样做,因为我发现它提高了可读性。
另外:我不确定您对复制的需求是什么,但如果学生保证是独一无二的,并且您对equals
和hashCode
有很好的实施,我会鼓励你使用Set<Student> students = new TreeSet<Student>();
。这样,它们会在您添加到集合时进行排序,如果您修改集合,它们会自动保持这种状态。