使用compareTo方法与数组学生的名字和考试成绩排序(Using the compareTo m

2019-08-02 14:03发布

我需要用可比interfact和compareTo方法来通过测试成绩按字母顺序排序,然后学生的名单。 我挣扎在得到这个在我的应用工作。

需要从一个文本文件中读取名称的列表。 我不知道有多少名字会在我的教授除了使用文本文件,这将是小于100,我也应该显示在底部的评分的平均值,以及接下来的消息写入任何学生是低于平均水平15点。 我还没有真正得到的消息写一部分,我目前停留在获取名字和分数打印和排序。

该文本文件应该是这个样子:

斯蒂尔曼安德烈95

Murach乔尔·98

洛道格·82

Murach迈克·93

这是我迄今为止......如果有人可以给我一点方向我将不胜感激。 谢谢。

package chapt11;
import java.io.FileReader;  
import java.util.Arrays; 
importjava.util.Scanner;
public class CH11AS8App {

/**
 * @param args
 */
public static void main(String[] args) throws Exception {

    System.out.println("Welcome to the Student Scores Application.");
    System.out.println();

    Scanner aScanner = new Scanner(new FileReader(
            "src//chapt11//ch11AS8data.txt"));

    Student [] studentArray;

    String lastName;
    String firstName;
    int examScore = 0;
    double average = 0;

    int nStudent = 100;  //array size not set unit run time
    studentArray = new Student[nStudent];

    for (int i=0; i<nStudent; i++)
    {
    System.out.println();

        while (aScanner.hasNext()) {
            lastName = aScanner.next();
            firstName = aScanner.next();
            examScore = aScanner.nextInt();

            System.out.println("Student " + nStudent++ + " " + firstName
                    + " " + lastName + " " + +examScore);

            studentArray[i] = new Student(lastName, firstName, examScore);


    }
        double sum = 0.0;
        sum += examScore;
        average = sum/nStudent;

        Arrays.sort(studentArray);

        System.out.println();

        for (Student aStudent: studentArray)
        {
            System.out.println(aStudent);

            if (examScore<= (average-10))
            {
                System.out.println ("Score 10 points under average");
        }
        System.out.println("Student Average:" +average);

        }
}
}
public interface Comparable {
    int compareTo(Object o);
}

class Student implements Comparable {

    private String firstName;
    private String lastName;
    private int examScore;

    public Student(String firstName, String lastName, int examScore) {
        this.firstName = firstName;
        this.examScore = examScore;
        this.lastName = lastName;
    }

    // Get & Set Methods
    public int getExamScore() {
        return examScore;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    @Override
    public int compareTo(Object o) {
        Student s = (Student) o;

        if (s.lastName.equals(lastName)) {
            return firstName.compareToIgnoreCase(s.firstName);
        } else {
            return lastName.compareToIgnoreCase(s.lastName);
        }
    }

    public String toString() {
        return lastName + ", " + firstName + ": " + examScore;

    }

}

}

Answer 1:

首先,完全删除您Comparable接口。 使用Comparable从JDK。

你的代码更改为这

public static class Student implements Comparable<Student> {

    // rest of class omitted

    @Override
    public int compareTo(Student s) {
        if (s.lastName.equals(lastName)) {
            return firstName.compareToIgnoreCase(s.firstName);
        }
        return lastName.compareToIgnoreCase(s.lastName);return
    }
}

还要注意的是有一个条件后没有“其他” return ,所以我省略了代码的冗余部分



Answer 2:

  1. 你千万不要自行申报可比接口。 简单地使用它。
  2. 你必须总结学生内环的考试分数,但算平均,排序外循环数组。


Answer 3:

有迹象表明,需要在你的代码校正几件事情:

  1. 您的Student类是内部类,以便创建一个类,你需要外部类的第一个对象的对象。 你可能想的对象可以在不外对象创建嵌套类(只添加static修饰符, Student类)
  2. 排序与数组Arrays.sort()对象必须实现java.lang.Comparable接口,而不是接口的创建。
  3. 您可以使用泛型Comparable<T>所以尽量实现你的Student与类implements Comparable<Student>{这样你compareTo方法可以像

     public int compareTo(Student s){//body 

    代替:

     public int compareTo(Object o){ Student s = (Student) o; 
  4. 由于您的数组将包含空值(不填写的地方它的默认值),则需要防止排序比较援引compareTo空元素。 要做到这一点使用Arrays.sort(Object[] a, int fromIndex, int toIndex)排序算法的版本。

  5. 再次检查你的逻辑,而从文件中收集信息。 为了让事情变得更容易不同时做几件事情。 首先收集的所有数据,然后做统计。

  6. 不要每次新数据添加到它的时间排序阵列,添加的所有数据后,做到这一点。


Answer 4:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CH11AS8App {

    public static void main(String[] args) throws Exception {

        System.out.println("Welcome to the Student Scores Application.");
        System.out.println();

        List<Student> studentArray = new ArrayList<Student>();

        String lastName;
        String firstName;
        int examScore = 0;
        double average = 0;

        String line;

        FileReader reader = new FileReader("src//chapt11//ch11AS8data.txt");
        BufferedReader bufferedReader = new BufferedReader(reader);
        String[] split;

        while ((line = bufferedReader.readLine()) != null) {
            split = line.split("\\s+");
            lastName = split[0];
            firstName = split[1];
            examScore = Integer.valueOf(split[2]);

            studentArray.add(new Student(firstName, lastName, examScore));
            double sum = 0.0;
        }
        Collections.sort(studentArray);

        System.out.println();

        System.out.println("sorted:" + studentArray);

        for (Student aStudent : studentArray) {
            System.out.println(aStudent);

            if (examScore <= (average - 10)) {
                System.out.println("Score 10 points under average");
            }
            System.out.println("Student Average:" + average);

        }
    }

    static class Student implements Comparable<Student> {

        private String firstName;
        private String lastName;
        private int examScore;

        public Student(String firstName, String lastName, int examScore) {
            this.firstName = firstName;
            this.examScore = examScore;
            this.lastName = lastName;
        }

        // Get & Set Methods
        public int getExamScore() {
            return examScore;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        @Override
        public int compareTo(Student s) {

            if (this.firstName.equalsIgnoreCase(s.firstName)) {
                if (this.lastName.equalsIgnoreCase(s.lastName)) {
                    return this.examScore - s.examScore;
                } else {
                    return this.lastName.compareTo(s.lastName);
                }
            } else {
                return this.firstName.compareTo(s.firstName);
            }


        }

        public String toString() {
            return lastName + ", " + firstName + ": " + examScore;

        }

    }
}


文章来源: Using the compareTo method with an array to sort students by name and test score