Java 如何将包含字符串和整数的文件读入ArrayList并按整数排序?
我试图从一个包含姓名和等级列表的文本文件中读取,按行组织,即: 大卫史密斯84 苏珊·波特100 然后将它们(按行)存储在ArrayList中,并使用选择排序算法根据学生的成绩对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
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