Как прочитать файл, содержащий строки и целые числа в ArrayList и отсортировать по целому числу? - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь читать из текстового файла, содержащего список имен и оценок, упорядоченный по строке, т.е.

Дэвид Смит 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());
        }
    }
}

Ответы [ 4 ]

0 голосов
/ 02 мая 2019

Создайте отдельный файл 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());
        }
    }
}


0 голосов
/ 02 мая 2019

Как только вы получили список студентов.Для этого вы можете использовать Comparator.

List<Student> sorted=list.sort(Comparator.comparing(p-> p.getGrade()));

Или использовать stream api

List<Person> result =list.stream().sorted((p1, p2)>p1.getGrade().compareTo(p2.getGrade())).collect(Collectors.toList());
0 голосов
/ 02 мая 2019

Вы можете создать объект ученика, который будет содержать имя и оценку отдельноПосле того, как вы добавили все данные в список, вы можете напрямую использовать метод list.sort () с помощью Comparator , но в вашем случае вы хотите написать сортировку выбора, поэтому вам нужно написать другой метод, чтобы сделать сортировку выбора.

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 + "]";
    }

}
0 голосов
/ 02 мая 2019

Будет легко, если вы объявите класс Student с 2 полями name и age.И вы можете заставить класс 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>, где вы можете сравнить 2 учеников (как Student implements Comparable<Student>), вызвав что-то вроде s1.compareTo(s2).

...