使用compareTo方法和数组按名称和测试分数对学生进行排序

我需要使用类似的interfact和compareTo方法按字母顺序对学生列表进行排序,然后按测试分数排序。 我正在努力让这个在我的应用程序中工作。

需要从文本文件中读取名称列表。 我不知道我的教授使用的文本文件中会有多少名称,除了它将小于100.我还应该在底部显示成绩的平均值以及在任何旁边写一条消息比平均水平低15分的学生。 我还没有真正了解写作消息部分,因为我目前仍然坚持要打印和排序的名称和分数。

文本文件应如下所示:

Steelman Andrea 95

Murach Joel 98

Lowe Doug 82

Murach Mike 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; } } 

}

首先,完全删除您的Comparable界面。 使用JDK中的Comparable

将您的代码更改为此

 public static class Student implements Comparable { // 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后没有“else”,所以我省略了代码的冗余部分

  1. 您不能自己声明Comparable接口。 只需使用它。
  2. 您必须在循环内对学生的考试成绩求和,但计算平均值,在循环外排序数组。

您的代码中很少需要更正:

  1. 您的Student类是内部类,因此要创建该类的对象,您需要外部类的第一个对象。 您可能希望嵌套类可以在没有外部对象的情况下创建对象(只需向Student类添加static修饰符)
  2. 要使用Arrays.sort()对象进行Arrays.sort()对象必须实现java.lang.Comparable接口,而不是您创建的接口。
  3. 你可以在Comparable使用generics,所以尝试使用implements Comparable{实现你的Studentimplements Comparable{这样你的compareTo方法就可以了

     public int compareTo(Student s){//body 

    代替:

     public int compareTo(Object o){ Student s = (Student) o; 
  4. 由于您的数组将包含空值(未填充位置的默认值),因此您需要阻止排序比较器在null元素上调用compareTo 。 要做到这一点,使用Arrays.sort(Object[] a, int fromIndex, int toIndex)版本的排序算法。

  5. 从文件中收集信息时再次检查您的逻辑。 为了方便起见,不要一次做几件事。 首先收集所有数据,然后进行统计。

  6. 每次向其添加新数据时都不要对数组进行排序,在添加所有数据后执行此操作。
 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 studentArray = new ArrayList(); 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 { 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; } } }