Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中对文本文件行进行排序_Java - Fatal编程技术网

在java中对文本文件行进行排序

在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

我有一个包含学生信息的文本文件,它有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();
    }
但排序后,在新文件中写入相同的内容:

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;
    }