使用比较器对 Student 类型的 ArrayList 进行排序,选择排序(在这种情况下不能使用 Collections.sort 方法)
Using a Comparator to sort an ArrayList of type Student, with selection sort (cannot use Collections.sort method in this case)
我非常坚持这个概念,似乎无法理解它。我有一个学校作业,我需要做一个 ArrayList<Student>
,其值为 String name
、String address
和 int rollno
.
创建 ArrayList 并填充它根本不是问题。我的问题是必须使用两个比较器 类 和一个选择排序来按名称和 rollno 对 ArrayList 进行排序。在这种情况下我不能使用 Collections.sort
方法。
我被困在这里,非常感谢您的帮助。
谢谢!
Sort.java
import java.util.*;
public class Sort {
public Comparator<Student>sortByRoll;
public Comparator<Student>sortByName;
public static void main(String [] args) {
// Declare ArrayList Student
ArrayList<Student>studentList = new ArrayList<Student>();
// Create Objects using Student Class
Student s1 = new Student("John Smith", 1001, "101 Meadow Ave");
Student s2 = new Student("William James", 2011, "1201 Joney Ave");
Student s3 = new Student("Rocky Ferguson", 3003, "1011 Bleeker Street");
Student s4 = new Student("Kitty Roberts", 9284, "906 Dog Ave");
Student s5 = new Student("Lionel Doe", 2100, "221 Colorado Ave");
Student s6 = new Student("Linus Jim", 5993, "26 Cass Ave");
Student s7 = new Student("Haley Henry", 9019, "20001 Log Blvd");
Student s8 = new Student("Penny Cone", 1009, "11 Cracked Court");
Student s9 = new Student("John Shepherd", 1029, "2010 Gold Street");
Student s10 = new Student("Joshua Old", 8463, "77 Railroad Street");
// Adding Objects to ArrayList studentList
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
studentList.add(s4);
studentList.add(s5);
studentList.add(s6);
studentList.add(s7);
studentList.add(s8);
studentList.add(s9);
studentList.add(s10);
}
}
Student.java
public class Student extends Sort {
// Variables for this class
public int rollno;
public String name;
public String address;
public String student;
// Constructor for creating a student
Student(String name, int rollno, String address) {
this.name = name;
this.rollno = rollno;
this.address = address;
}
//Getters for name, address, and number
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getRollNo() {
return rollno;
}
}
SortByName.java
import java.util.Comparator;
public class sortByName extends Sort implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// Help Plz
};
sortByNum.java
import java.util.Comparator;
public class sortByNum extends Sort implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
//Help plz
}
};
}
您不能使用 Collections.sort(Comparator)
,因为正如您所说,您的任务是实现选择排序。我不会详细介绍算法(我想这是你的练习),但你可以在比较器中实现 compare
方法,如下所示:
卷号:
@Override
public int compare(Student o1, Student o2) {
return Integer.compare(o1.getRollNo(), o2.getRollNo());
}
姓名:
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
有了这些比较器,你可以调用这个compare(Student, Student)
方法来根据比较器得到一个学生是小于(-1),等于(0)还是大于(1)另一个学生.这就是您在选择排序算法中用来比较 Student 对象的内容。
根据要求编辑:排序方法本身可以放在您的主 class Sort
中,如下所示:
public void sortOnRollNo(List<Student> list) {
// Sort the list here using the sortByRoll Comparator.
}
public void sortOnStudentName(List<Student> list) {
// Sort the list here using the sortByName Comparator.
}
对于您的任何一个 compare
方法,您只需要 return 0 如果两个对象的排序顺序相同,-1 如果 o1
是 'before' o2
按排序顺序,如果 o1
按排序顺序 'after' o2
则为 1。
如果您纯粹根据名称进行比较,您可以这样做:
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
这使用了字符串的内置比较。
或者如果您想根据卷号进行比较:
@Override
public int compare(Student o1, Student o2) {
if (o1.getRollNo() == o2.getRollNo()) {
return 0;
} else if (o1.getRollNo() < o2.getRollNo()) {
return -1;
} else {
return 1;
}
}
我意识到有更有效的方法可以做到这一点,但我试图弄清楚发生了什么。
你所要做的就是决定两个学生中的哪一个应该先来,return -1 如果是 o1
,1 如果是 o2
或 0 如果他们等同于排序顺序。
我非常坚持这个概念,似乎无法理解它。我有一个学校作业,我需要做一个 ArrayList<Student>
,其值为 String name
、String address
和 int rollno
.
创建 ArrayList 并填充它根本不是问题。我的问题是必须使用两个比较器 类 和一个选择排序来按名称和 rollno 对 ArrayList 进行排序。在这种情况下我不能使用 Collections.sort
方法。
我被困在这里,非常感谢您的帮助。
谢谢!
Sort.java
import java.util.*;
public class Sort {
public Comparator<Student>sortByRoll;
public Comparator<Student>sortByName;
public static void main(String [] args) {
// Declare ArrayList Student
ArrayList<Student>studentList = new ArrayList<Student>();
// Create Objects using Student Class
Student s1 = new Student("John Smith", 1001, "101 Meadow Ave");
Student s2 = new Student("William James", 2011, "1201 Joney Ave");
Student s3 = new Student("Rocky Ferguson", 3003, "1011 Bleeker Street");
Student s4 = new Student("Kitty Roberts", 9284, "906 Dog Ave");
Student s5 = new Student("Lionel Doe", 2100, "221 Colorado Ave");
Student s6 = new Student("Linus Jim", 5993, "26 Cass Ave");
Student s7 = new Student("Haley Henry", 9019, "20001 Log Blvd");
Student s8 = new Student("Penny Cone", 1009, "11 Cracked Court");
Student s9 = new Student("John Shepherd", 1029, "2010 Gold Street");
Student s10 = new Student("Joshua Old", 8463, "77 Railroad Street");
// Adding Objects to ArrayList studentList
studentList.add(s1);
studentList.add(s2);
studentList.add(s3);
studentList.add(s4);
studentList.add(s5);
studentList.add(s6);
studentList.add(s7);
studentList.add(s8);
studentList.add(s9);
studentList.add(s10);
}
}
Student.java
public class Student extends Sort {
// Variables for this class
public int rollno;
public String name;
public String address;
public String student;
// Constructor for creating a student
Student(String name, int rollno, String address) {
this.name = name;
this.rollno = rollno;
this.address = address;
}
//Getters for name, address, and number
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public int getRollNo() {
return rollno;
}
}
SortByName.java
import java.util.Comparator;
public class sortByName extends Sort implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// Help Plz
};
sortByNum.java
import java.util.Comparator;
public class sortByNum extends Sort implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
//Help plz
}
};
}
您不能使用 Collections.sort(Comparator)
,因为正如您所说,您的任务是实现选择排序。我不会详细介绍算法(我想这是你的练习),但你可以在比较器中实现 compare
方法,如下所示:
卷号:
@Override
public int compare(Student o1, Student o2) {
return Integer.compare(o1.getRollNo(), o2.getRollNo());
}
姓名:
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
有了这些比较器,你可以调用这个compare(Student, Student)
方法来根据比较器得到一个学生是小于(-1),等于(0)还是大于(1)另一个学生.这就是您在选择排序算法中用来比较 Student 对象的内容。
根据要求编辑:排序方法本身可以放在您的主 class Sort
中,如下所示:
public void sortOnRollNo(List<Student> list) {
// Sort the list here using the sortByRoll Comparator.
}
public void sortOnStudentName(List<Student> list) {
// Sort the list here using the sortByName Comparator.
}
对于您的任何一个 compare
方法,您只需要 return 0 如果两个对象的排序顺序相同,-1 如果 o1
是 'before' o2
按排序顺序,如果 o1
按排序顺序 'after' o2
则为 1。
如果您纯粹根据名称进行比较,您可以这样做:
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
这使用了字符串的内置比较。
或者如果您想根据卷号进行比较:
@Override
public int compare(Student o1, Student o2) {
if (o1.getRollNo() == o2.getRollNo()) {
return 0;
} else if (o1.getRollNo() < o2.getRollNo()) {
return -1;
} else {
return 1;
}
}
我意识到有更有效的方法可以做到这一点,但我试图弄清楚发生了什么。
你所要做的就是决定两个学生中的哪一个应该先来,return -1 如果是 o1
,1 如果是 o2
或 0 如果他们等同于排序顺序。