在实现 Comparable 接口的 class 中调用 collections.sort() 方法时引用的当前对象是什么?
what is the current object referred to while calling collections.sort() method inside a class which implements Comparable interface?
public class TestSort3{
public static void main(String args[]){
ArrayList<Student> al=new ArrayList<Student>();
al.add(new Student(101,"Vijay",23));
al.add(new Student(106,"Ajay",27));
al.add(new Student(105,"Jai",21));
Collections.sort(al);
for(Student st:al){
System.out.println(st.rollno+" "+st.name+" "+st.age);
}
}
}
compareTo
的定义为:
class Student implements Comparable <Student> {
int rollno;
String name;
int age;
Student(int rollno, String name, int age) {
this.rollno = rollno;
this.name = name;
this.age = age;
}
public int compareTo(Student st) {
if (age == st.age)
return 0;
else if (age > st.age)
return 1;
else
return -1;
}
}
我无法获得在 compareTo
方法中比较年龄的逻辑。当Collections.sort()
方法被调用时,compareTo()
会被调用并且我们已经传递了ArrayList
的实例,所以它需要Student
的实例传递class,现在与之比较的另一个 Student
实例是哪个?
我已经查看了与此方法相关的其他 Whosebug 链接,但我无法澄清我的疑问,请澄清这一点。
- 每个学生对象都将与其他学生对象进行比较
你的清单。
- 因此,当一个学生对象年龄将与作为参数传递到 compareTo 方法中的其他学生对象年龄进行比较时。
假设我们有如下三个学生。
Student vijay = new Student(101, "vijay", 23);
Student ajay= new Student(106, "Ajay", 27);
Student jai= new Student(105, "jai", 21);
- 你有一个学生
vijay
即 new Student(101,"Vijay",23)
compareTo()
方法正在 vijay
中调用,它将与 new Student(106,"Ajay", 26 )
定义的 ajay
进行比较。
compareTo()
方法的实现方式是比较 age
并且 vijay
在逻辑上小于 Ajay
.
- 返回 0 表示对象在逻辑上相等
- 返回负整数意味着
this
对象小于传递给 compareTo
方法的对象。
- 返回正整数意味着
this
对象在逻辑上大于传递给 compareTo()
方法的对象。
总的来说,
- vijay
将与 ajay
进行比较,并且由于我们的实施,vijay
在逻辑上小于 ajay
。
- ajay
将与 jai
进行比较,并且 ajay
在逻辑上将大于 jai
所有组合的元素都会发生这种过程,最终结果将按年龄递增的顺序排列,即jai < vijay < ajay
在java中实现了不同的排序算法,这些算法将根据与我们的问题无关的特定场景来选择。
this
只是指调用 compareTo
的对象。在调用 Collections.sort
的情况下,它可能是集合中的任何成员。
让它不那么抽象:
为了使用 compareTo
,必须这样调用它:
a.comparTo(b)
其中 a
和 b
都是 Student
的实例。 Collections.sort
正是这样做的(尽管实际调用似乎是在 [Arrays.mergSort][1]
中)。使用哪个实例的细节取决于实现的排序算法和集合中元素的初始顺序。
public class TestSort3{
public static void main(String args[]){
ArrayList<Student> al=new ArrayList<Student>();
al.add(new Student(101,"Vijay",23));
al.add(new Student(106,"Ajay",27));
al.add(new Student(105,"Jai",21));
Collections.sort(al);
for(Student st:al){
System.out.println(st.rollno+" "+st.name+" "+st.age);
}
}
}
compareTo
的定义为:
class Student implements Comparable <Student> {
int rollno;
String name;
int age;
Student(int rollno, String name, int age) {
this.rollno = rollno;
this.name = name;
this.age = age;
}
public int compareTo(Student st) {
if (age == st.age)
return 0;
else if (age > st.age)
return 1;
else
return -1;
}
}
我无法获得在 compareTo
方法中比较年龄的逻辑。当Collections.sort()
方法被调用时,compareTo()
会被调用并且我们已经传递了ArrayList
的实例,所以它需要Student
的实例传递class,现在与之比较的另一个 Student
实例是哪个?
我已经查看了与此方法相关的其他 Whosebug 链接,但我无法澄清我的疑问,请澄清这一点。
- 每个学生对象都将与其他学生对象进行比较 你的清单。
- 因此,当一个学生对象年龄将与作为参数传递到 compareTo 方法中的其他学生对象年龄进行比较时。
假设我们有如下三个学生。
Student vijay = new Student(101, "vijay", 23);
Student ajay= new Student(106, "Ajay", 27);
Student jai= new Student(105, "jai", 21);
- 你有一个学生
vijay
即new Student(101,"Vijay",23)
compareTo()
方法正在vijay
中调用,它将与new Student(106,"Ajay", 26 )
定义的ajay
进行比较。compareTo()
方法的实现方式是比较age
并且vijay
在逻辑上小于Ajay
.- 返回 0 表示对象在逻辑上相等
- 返回负整数意味着
this
对象小于传递给compareTo
方法的对象。 - 返回正整数意味着
this
对象在逻辑上大于传递给compareTo()
方法的对象。
总的来说,
- vijay
将与 ajay
进行比较,并且由于我们的实施,vijay
在逻辑上小于 ajay
。
- ajay
将与 jai
进行比较,并且 ajay
在逻辑上将大于 jai
所有组合的元素都会发生这种过程,最终结果将按年龄递增的顺序排列,即jai < vijay < ajay
在java中实现了不同的排序算法,这些算法将根据与我们的问题无关的特定场景来选择。
this
只是指调用 compareTo
的对象。在调用 Collections.sort
的情况下,它可能是集合中的任何成员。
让它不那么抽象:
为了使用 compareTo
,必须这样调用它:
a.comparTo(b)
其中 a
和 b
都是 Student
的实例。 Collections.sort
正是这样做的(尽管实际调用似乎是在 [Arrays.mergSort][1]
中)。使用哪个实例的细节取决于实现的排序算法和集合中元素的初始顺序。