Java 如何将包含字符串和整数的文件读入ArrayList并按整数排序?

Java 如何将包含字符串和整数的文件读入ArrayList并按整数排序?,java,algorithm,file,arraylist,selection-sort,Java,Algorithm,File,Arraylist,Selection Sort,我试图从一个包含姓名和等级列表的文本文件中读取,按行组织,即: 大卫史密斯84 苏珊·波特100 然后将它们(按行)存储在ArrayList中,并使用选择排序算法根据学生的成绩对ArrayList进行排序,但是我尝试了多种不同的方法来编码,每次编辑似乎都会提示另一个错误(我对编程非常陌生)。这就是我目前拥有的: import java.io.*; import java.util.*; public class Grades { private static void sort(Ar

我试图从一个包含姓名和等级列表的文本文件中读取,按行组织,即:

大卫史密斯84

苏珊·波特100

然后将它们(按行)存储在ArrayList中,并使用选择排序算法根据学生的成绩对ArrayList进行排序,但是我尝试了多种不同的方法来编码,每次编辑似乎都会提示另一个错误(我对编程非常陌生)。这就是我目前拥有的:

import java.io.*;
import java.util.*;

public class Grades {
    private static void sort(ArrayList<String> list) {
        int pFill;
        int pTest;
        int pSmallest;
        String temp;
        for (pFill = 0; pFill < list.size(); pFill++) {
            pSmallest = pFill;
            for (pTest = pFill + 1; pTest < list.size(); pTest++) {
                if (pTest < pSmallest) {
                    pSmallest = pTest;
                }
            }
            temp = list.get(pSmallest);
            list.set(pSmallest, list.get(pFill));
            list.set(pFill, temp);
        }
    } 

    public static void main(String[] args){
        ArrayList<String> list = new ArrayList<>();
        String fileName = "students.txt";
        try (BufferedReader input = new BufferedReader(new FileReader(fileName))) {
            while(input.ready()){
                list.add(input.readLine());
            }
            input.close();
            sort(list);
            System.out.println(list);
        } catch (IOException e){
                System.out.println(e.getMessage());
        }
    }
}
import java.io.*;
导入java.util.*;
公营班级职系{
私有静态无效排序(ArrayList列表){
int pFill;
int pTest;
内压最小;
字符串温度;
对于(pFill=0;pFill
如果您声明一个
学生
类,该类包含两个字段
姓名
年龄
。你可以让
学生
班级实施
可比
并根据成绩进行比较。它看起来像这样:

公共班级学生实施可比{
私有最终字符串名;
私人期末综合成绩;
公立学生(字符串名称,整数等级){
this.name=名称;
这个。等级=等级;
}
@凌驾
公共int比较(学生s){
返回整数。比较(this.grade,grade);
}
}
要填充
学生
对象,您需要拆分
字符串
并提取姓名和成绩,然后调用
新学生(姓名、成绩)


sort
方法中,您可以通过调用类似
s1.compareTo(s2)
的内容,传递一个
列表,在该列表中您可以比较两个学生(因为
Student实现了Comparable
),如果您声明一个
Student
类,该类包含两个字段
name
age
,那么就很容易了。你可以让
学生
班级实施
可比
并根据成绩进行比较。它看起来像这样:

公共班级学生实施可比{
私有最终字符串名;
私人期末综合成绩;
公立学生(字符串名称,整数等级){
this.name=名称;
这个。等级=等级;
}
@凌驾
公共int比较(学生s){
返回整数。比较(this.grade,grade);
}
}
要填充
学生
对象,您需要拆分
字符串
并提取姓名和成绩,然后调用
新学生(姓名、成绩)


排序
方法中,您可以传递一个
列表
,在该列表中,您可以通过调用类似于
s1.compareTo(s2)
的东西来比较两个学生(因为
学生实现了可比较的
)。您可以使用比较器来执行此操作

List<Student> sorted=list.sort(Comparator.comparing(p-> p.getGrade()));
List-sorted=List.sort(Comparator.comparing(p->p.getGrade());
或者使用流api

List<Person> result =list.stream().sorted((p1, p2)>p1.getGrade().compareTo(p2.getGrade())).collect(Collectors.toList());
List result=List.stream().sorted((p1,p2)>p1.getGrade().compareTo(p2.getGrade()).collect(Collectors.toList());

一旦你拿到学生名单。您可以使用比较器来执行此操作

List<Student> sorted=list.sort(Comparator.comparing(p-> p.getGrade()));
List-sorted=List.sort(Comparator.comparing(p->p.getGrade());
或者使用流api

List<Person> result =list.stream().sorted((p1, p2)>p1.getGrade().compareTo(p2.getGrade())).collect(Collectors.toList());
List result=List.stream().sorted((p1,p2)>p1.getGrade().compareTo(p2.getGrade()).collect(Collectors.toList());

您可以创建一个学生对象来分别保存姓名和成绩。将所有数据添加到列表中后,您可以通过使用直接使用list.sort()方法,但在您的情况下,您需要编写选择排序,这就是为什么您必须编写另一个方法来执行选择排序

package com.stackovflow.problems;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.ArrayList;
公营班级职系{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
字符串fileName=“students.txt”;
try(BufferedReader input=new BufferedReader(new FileReader(fileName))){
while(input.ready()){
String line=input.readLine().trim();
字符串名称=line.substring(0,line.lastIndexOf(“”));
int grade=Integer.parseInt(line.substring(line.lastIndexOf(“”)+1));
列表。添加(新学生(姓名、年级));
}
input.close();
选择排序(列表);
系统输出打印项次(列表);
}捕获(IOE异常){
System.out.println(e.getMessage());
}
}
专用静态无效选择排序(ArrayList列表){
int pFill;
int pTest;
内压最小;
学生临时工;
对于(pFill=0;pFill