繁体   English   中英

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

[英]How to read a file containing strings and integers into an ArrayList and sort by integer?

我正在尝试从包含按行组织的名称和等级列表的文本文件中读取,即:

大卫·史密斯84

苏珊L波特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());
        }
    }
}

如果您声明一个带有两个字段nameageStudent类将很容易。 您可以使Student班级实现Comparable并根据年级进行比较。 它看起来像这样:

public class Student implements Comparable<Student> {
    private final String name;
    private final int grade;
    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }
    @Override
    public int compareTo(Student s) {
        return Integer.compare(this.grade, grade);
    }
}

要填充Student对象,您将需要拆分String并提取名称和等级,然后调用new Student(name, grade)

在您的sort方法中,您可以传递List<Student> ,您可以在其中通过调用s1.compareTo(s2)来比较2个学生(由于Student implements Comparable<Student> s1.compareTo(s2)

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

List<Student> 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.sort()方法通过使用比较 ,但在你的情况,你要那种写的选择,这就是为什么你必须写另一种方法做选择排序。

package com.stackovflow.problems;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Grades {

        public static void main(String[] args){
            ArrayList<Student> list = new ArrayList<>();
            String fileName = "students.txt";
            try (BufferedReader input = new BufferedReader(new FileReader(fileName))) {
                while(input.ready()){
                    String line = input.readLine().trim();
                    String name = line.substring(0,line.lastIndexOf(' '));
                    int grade = Integer.parseInt(line.substring(line.lastIndexOf(' ')+1));
                    list.add(new Student(name, grade));
                }
                input.close();
                selectionSort(list);
                System.out.println(list);
            } catch (IOException e){
                    System.out.println(e.getMessage());
            }
        }

        private static void selectionSort(ArrayList<Student> list) {
            int pFill;
            int pTest;
            int pSmallest;
            Student temp;
            for (pFill = 0; pFill < list.size(); pFill++) {
                pSmallest = pFill;
                for (pTest = pFill + 1; pTest < list.size(); pTest++) {
                    Student pTestStudent = list.get(pTest);
                    Student pSmallestStudent = list.get(pSmallest);
                    if (pTestStudent.getGrade() < pSmallestStudent.getGrade()) {
                        pSmallest = pTest;
                    }
                }
                if(pSmallest!=pFill) {
                    temp = list.get(pSmallest); 
                    list.set(pSmallest, list.get(pFill));
                    list.set(pFill, temp);
                }
            }

        }
    }

//This class is to hold line data in your students.txt file
class Student{
    private String name;
    private int grade;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
    public Student(String name, int grade) {
        super();
        this.name = name;
        this.grade = grade;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", grade=" + grade + "]";
    }

}

在同一文件夹中创建一个单独的Student.java文件,以保存Student类:

public class Student {
    private final String name;
    private final int grade;
    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }
    public String getName(){
        return name;
    }
    public int getGrade(){
        return grade;
    }
}

然后将每行按空格分开,并将第一个标记设置为名称,将最后一个标记设置为成绩,然后使用Comparator对学生对象的ArrayList进行排序:

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


public class Grades {
    private static ArrayList<Student> sort(ArrayList<String> list) {

        ArrayList<Student> students = new ArrayList<Student>();

        String name = "";
        int grade;

        for (String line : list) {
            String[] splitted = line.split("\\s+");

            for(int i = 0;i< splitted.length-1;i++){
                name += splitted[i] + " ";
            }
            grade = Integer.parseInt(splitted[splitted.length-1]);
            students.add(new Student(name,grade));
            name = "";

        }
        students.sort(Comparator.comparing(student-> student.getGrade()));

        return students;

    } 

    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();
            ArrayList<Student> sortedStudents = sort(list);

            for (Student currentStudent : sortedStudents) 
                System.out.println(currentStudent.getName() + currentStudent.getGrade());                


        } catch (IOException e){
                System.out.println(e.getMessage());
        }
    }
}


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM