用java对文本文件行进行排序



我有一个包含学生信息的文本文件,它有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

最新更新