我有一个包含学生信息的文本文件,它有5列:ID, FName, LName, Age, Grade。我想按学生的成绩对文件行进行排序,但是不行。这是我的方法:
public static void sortAndShow() throws Exception {
ArrayList <Student> list = new ArrayList<Student>();
BufferedReader reader = new BufferedReader(new FileReader(originalFile));
String str = reader.readLine();
while (str != null) {
String[] detailsSt = str.split(" ");
int id = Integer.parseInt(detailsSt[0]);
String name = detailsSt[1];
String lastname = detailsSt[2];
int age = Integer.parseInt(detailsSt[3]);
int grade = Integer.parseInt(detailsSt[4]);
list.add(new Student(id, name, lastname, age, grade));
str = reader.readLine();
}
Collections.sort(list, new gradeCompare());
PrintWriter writer = new PrintWriter(new FileWriter(sortedFile, false));
for (Student st : students) {
writer.write((st.getStNum() + " " + st.getFirstName() + " " + st.getLastName() + " " + st.getAge() + " " + st.getGrade() + "n"));
}
reader.close();
writer.close();
}
和我的内部类进行比较的过程:
static class gradeCompare implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o2.getGrade() - o1.getGrade();
}
}
排序前的文本文件:
101 Jeff King 18 12
102 Tim Woods 17 19
但是排序之后,在新文件中写入相同的内容:
101 Jeff King 18 12
102 Tim Woods 17 19
我想排序后我的文本文件是这样的(最后一列是等级):
102 Tim Woods 17 19
101 Jeff King 18 12
您的错误是您正在编写来自另一个列表的元素
修改代码:
for (Student st : students) {
writer.write((st.getStNum() + " " + st.getFirstName() + " " + st.getLastName() + " " + st.getAge() + " " + st.getGrade() + "n"));
}
for (Student st : list) {
writer.write((st.getStNum() + " " + st.getFirstName() + " " + st.getLastName() + " " + st.getAge() + " " + st.getGrade() + "n"));
}
问题是你正在使用students
列表(我不确定那是什么)所以你应该使用list
变量,这是你在Collections.sort(list, new gradeCompare());
中订购的列表在compare
方法中,你应该交换返回表达式,而不是o2.getGrade() - o1.getGrade();
,你必须这样使用:
public int compare(Student o1, Student o2) {
return o1.grade - o2.grade;
}
什么是students
代码排序list
,但从students
写!
Collections.sort(list, new gradeCompare());
...
for (Student st : students) {
在这种情况下,Comparator
可以工作,但不建议使用减法-很容易溢出/下溢。按照Johnny的建议去做,或者使用Integer.compare(int, int)
,…或者,功能:Collections.sort(list, Comparator.comparingInt(Student::getGrade).reverse())
我使用的代码(格式不太好,因为在jshell
中测试过):
record Student(int id, String name, String lastName, int age, int grade) {}
class gradeCompare implements Comparator<Student> {
public int compare(Student o1, Student o2) {
return o2.grade() - o1.grade();
}
}
String inp = """
101 Jeff King 18 12
102 Tim Woods 17 19
""";
ArrayList <Student> list = new ArrayList<Student>();
var reader = new BufferedReader(new StringReader(inp));
String str = reader.readLine();
while (str != null) {
String[] detailsSt = str.split(" ");
int id = Integer.parseInt(detailsSt[0]);
String name = detailsSt[1];
String lastname = detailsSt[2];
int age = Integer.parseInt(detailsSt[3]);
int grade = Integer.parseInt(detailsSt[4]);
list.add(new Student(id, name, lastname, age, grade));
str = reader.readLine();
}
Collections.sort(list, new gradeCompare());
输出:
jshell> list list ==> [Student[id=102, name=Tim, lastName=Woods, age=17, grade=19], Student[id=101, name=Jeff, lastName=King, age=18, grade=12]]
<代码>代码>
问题在于您的Collections.sort(studentsList, gradeCompare)
方法实现。试试这个-
PP_13然后使用CC_15