在java中对文本文件行进行排序
我有一个包含学生信息的文本文件,它有5列:ID、FName、LName、Age、Grade。 我想按学生的成绩对文件行进行排序,但不起作用。以下是我的方法:在java中对文本文件行进行排序,java,Java,我有一个包含学生信息的文本文件,它有5列:ID、FName、LName、Age、Grade。 我想按学生的成绩对文件行进行排序,但不起作用。以下是我的方法: public static void sortAndShow() throws Exception { ArrayList <Student> list = new ArrayList<Student>(); BufferedReader reader = new BufferedRe
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();
}
但排序后,在新文件中写入相同的内容:
101 Jeff King 18 12
102 Tim Woods 17 19
在对文本文件进行排序后,我想如下所示(最后一列是grade):
问题在于您的
比较(Student thistudent,studenthatsudent)
方法实现。试试这个-
public int compare(Student o1, Student o2) {
if (o2.getGrade() > o1.getGrade()) {
return -1; //return 1 when the grade is lower
} else if (o2.getGrade() < o1.getGrade()) {
return 1; //return 1 when the grade is the higher
} else return 0; //return 0 when the grade is the same
}
public int比较(学生o1,学生o2){
如果(o2.getGrade()>o1.getGrade()){
return-1;//等级较低时返回1
}否则如果(o2.getGrade()
然后使用
Collections.sort(studentsList,gradeCompare)
什么是students
?代码正在排序
列表
,但从学生
开始编写
Collections.sort(list, new gradeCompare());
...
for (Student st : students) {
在这种情况下,
比较器
可以工作,但不建议使用减法-很容易上溢/下溢。按照建议执行,或使用整数。比较(int,int)
,。。。或者,功能:Collections.sort(list,Comparator.comparingit(Student::getGrade.reverse())
我使用的代码(格式不好,因为在
jshell
中进行了测试):
您的错误是您正在从另一个列表中写入元素 更改此代码:
for (Student st : students) {
writer.write((st.getStNum() + " " + st.getFirstName() + " " + st.getLastName() + " " + st.getAge() + " " + st.getGrade() + "\n"));
}
到
问题是您使用的是学生
列表(我不确定该列表是什么),因此您应该使用列表
变量,这是您在集合中排序的列表。排序(list,new gradeCompare())代码>
在compare
方法中,应该交换返回表达式,而不是o2.getGrade()-o1.getGrade()代码>您必须像这样使用:
public int compare(Student o1, Student o2) {
return o1.grade - o2.grade;
}
结果还是一样,还是不起作用correctly@Vistahm在compare
method:返回o1.getGrade()>o2.getGrade()?1:o2.getGrade()==o1.getGrade()?0 : -1;代码>@EDGARM再次显示相同的结果@Vistahm我想问题在于你使用的列表:for(Student st:students)
将其更改为for(Student st:list)
我已经更新了我的答案,所以尝试一下新代码我确定要打开文件,你编辑了代码还是添加了一些新东西?我能看看你的代码吗?看看我的编辑!我只是使用了与您发布的几乎相同的代码,只是从字符串中读取,并直接检查列表(jshell)好的,添加了代码…下次请发布
Collections.sort(list, new gradeCompare());
...
for (Student st : students) {
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]]
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"));
}
public int compare(Student o1, Student o2) {
return o1.grade - o2.grade;
}