我了解我们可以根据需求对存储在Collection中的对象进行排序或排序。
虽然我有深刻的了解,但我并不相信这样的事实,即排列方式的升序和降序是通过(a-b)->升序或(b-a)->降序来实现的,其中“a”和“b”是类我们选择比较的成员。
例:
public int compareTo(Student s) {
return this.grade - s.grade; //ascending order
// return s.grade - this.grade; // descending order
}
订购对象元素背后的逻辑是什么?如果正数1如何将“(this.grade-s.grade)”移到“this.grade”的前面,然后将“s.grade”放在下一个顺序,为什么不反过来呢?谁验证比较结果(+ 1,-1、0)然后分别以升序或降序排列,是否有任何文档描述该部分的内部工作?
public class Student implements Comparable <Student>{
String name;
int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public int compareTo(Student s) {
return this.grade - s.grade; //ascending order
// return s.grade - this.grade; // descending order
}
public String toString() {
return this.name + ", " + this.grade;
}
}
请分享,非常感谢!
编辑:
我得到了Java文档,我的问题是这样的:
sort these grades (13, 2)
Case ascending -> return this.grade - s.grade;
picture in my mind:
compare (13, 2) , (13 - 2) > 0 so move 2 to front.
result -> 2, 13
------
Case descending -> return s.grade - this.grade;
picture in my mind:
compare (2, 13) , (2 - 13) < 0 so move 13 to front.
result -> 13, 2
“这是怎么发生的?”是我最初的问题。我读了文档,仍然不知道。
最佳答案
在许多计算机语言中,使用负数表示“小于此数量”,使用正数表示“大于此数量”和0表示“这两个条件相等”已经使用了30多年。
有几个内部类使用返回值对数组或集合中的元素进行重新排序,包括Collections.sort()
Arrays.sort()
TreeSet
编辑
为了回答如何工作,您将必须查看上面列出的每个类的源代码。为了使排序尽可能高效,它们中的一些非常复杂。但总的来说,一切都归结为这样的代码:
if( data[i].compareTo(data[j]) > 0 ){
// swap data[i] and data[j]
}