【问题标题】:ArrayList and sorting method for names名称的ArrayList和排序方法
【发布时间】:2014-11-02 23:14:00
【问题描述】:

我几乎完成了这个项目。我需要帮助弄清楚为什么在询问姓氏之后它在询问名字之前没有暂停。当我尝试添加新的比较器以按分数排序时,我也不断收到错误消息。

package student.scores;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
import java.util.ArrayList;
import java.util.*;




public class StudentScores{


   public static void main(String[] args) {
    System.out.println("Welcome to the Student Scores Application.");

Scanner input = new Scanner (System.in);
System.out.println("Enter number of students: ");
int numStudents = input.nextInt();
List<Student> students = new ArrayList<>();

for (int i = 0; i < numStudents; i++) {
    System.out.println("Enter Student Last Name: ");
    String lastName = input.nextLine();

    System.out.println("Enter Student First Name: ");
    String firstName = input.nextLine();

    System.out.println("Enter Student Score: ");
    int score = input.nextInt();
    students.add(new Student(lastName, firstName, score));
}
Collections.sort(students);
System.out.println("Students in alphabetical order");
for (Student s : students) {
    System.out.println(s);
}
Collections.sort(students, new Comparator() {});
System.out.println("Students by score");
for (Student s : students) {
    System.out.println(s);

}

static class Student implements Comparable<Student> 

{

   private  String lastName;
   private String firstName;
   private int scores;

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

    public int getScores()
    {
        return scores;
    }

    public String getLastName()
    {
        return lastName;
    }

    public String getFirstName()
    {
        return firstName;
    }

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

    static class StudentScoreComparator implements Comparator<Student>
    {
        @Override
        public int compare(Student o1, Student o2)
        {
            return (Integer.valueOf(o1.getScores())).compareTo(o2.getScores());
        }
    }
    @Override
    public String toString() {
           return String.format("%s %s %d", firstName, lastName, scores);
    }

} }

【问题讨论】:

  • 我不想在这里扯淡,但您指出程序“将结果存储在数组中”并且您正在使用 ArrayList。这样可以吗?

标签: java arrays sorting arraylist


【解决方案1】:

我相信按score 排序的最简单方法是添加第二个实现Comparator&lt;Student&gt; 的类

static class StudentScoreComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return (Integer.valueOf(o1.getScores())).compareTo(o2.getScores());
    }
}

然后,您可以将 Comparator 的一个实例传递给排序方法,并按分数排序。

编辑

然后我会添加一个toString()Student 喜欢

@Override
public String toString() {
    return String.format("%s %s %d", firstName, lastName, scores);
}

编辑 2

我认为你的 main() 应该看起来像,

public static void main(String[] args) {
    System.out.println("Welcome to the Student Scores Application.");

    Scanner input = new Scanner (System.in);
    System.out.println("Enter number of students: ");
    int numStudents = input.nextInt();
    List<Student> students = new ArrayList<>();

    for (int i = 0; i < numStudents; i++) {
        System.out.println("Enter Student Last Name: ");
        String lastName = input.nextLine();

        System.out.println("Enter Student First Name: ");
        String firstName = input.nextLine();

        System.out.println("Enter Student Score: ");
        int score = input.nextInt();
        students.add(new Student(lastName, firstName, score));
    }
    Collections.sort(students);
    System.out.println("Students in alphabetical order");
    for (Student s : students) {
        System.out.println(s);
    }
    Collections.sort(students, new StudentScoreComparator());
    System.out.println("Students by score");
    for (Student s : students) {
        System.out.println(s);
    }
}

【讨论】:

  • 其实我会尝试添加的。
  • @LauraBullard 已编辑。您发布的代码似乎按名称排序。 Comparator 将允许您按分数排序。将toString() 添加到Student 您可以简单地迭代您的排序数组或列表并打印每个Student
  • Frisch 我将 toString 添加到了可比较的底部。那是它应该在的地方吗?还有我接下来应该怎么做?我一直坚持如何完成这个程序。非常感谢所有帮助。
  • @LauraBullard toString() 应该是Student 中的一个方法。我又看了你的 main() 方法。您没有将任何内容存储为 Student
  • @LauraBullard 你确定这个作业允许你使用 Java 集合还是作业的重点是使用课堂上教授的排序算法?
【解决方案2】:

您的代码根本没有使用 Student 类。您需要捕获每个Student 的名字、姓氏和分数,并将条目存储在Student 对象的数组中。

System.out.print("Enter student's first name: ");
String fname = input.next(); // Since names should not have white spaces, use next() instead of nextLine()

System.out.print("Enter student's last name: ");
String lname = input.next();

System.out.print("Enter student's score");
int score = input.next();

record[i] = new Student(fname, lname, score);

上面的代码 sn-p 应该在你的循环中。每次迭代您都会捕获学生的全名和分数,并在您的 Student 数组中添加一个新的 Student 实例。我理解你的作业的方式,每个学生对象代表一个记录。该数组可以(并且将)为特定学生提供多个条目,但不一定按顺序排列。排序有助于一个接一个地打印出同一学生的所有记录。例如,数组的索引 0 可能是“Joe Smith”,而索引 1 可能是“Anne Johnson”。排序后,应首先列出 Anne Johnson 的所有记录,然后是 Joe Smith 的记录。

要按名称排序,您需要将当前索引与下一个索引进行比较,如果有要比较的话。首先,您必须获取姓氏并进行比较。如果他们是平等的,抓住第一个名字。如果它们相等,则假设它们(记录)是针对同一个学生的(您可以在此时决定获取分数以按分数排序)。如果名称不同,则记录是针对不同学生的,因此您必须执行排序。我确信这是一项学校作业,因此请使用课堂上教授的一种排序算法(可能是冒泡排序)并对数组进行排序。最有可能的是,您需要多次传递才能使数组按名称和分数完全排序。

【讨论】:

    【解决方案3】:

    我发现了我的问题。我为 Comparable 方法添加了一个导入。我还更改了它以在输出之间添加一条线。

    package student.scores;
    import java.util.Scanner;
    import java.util.Comparator;
    import java.util.ArrayList;
    import java.util.*;
    import student.scores.StudentScores.Student.StudentScoreComparator;
    
    
    
    
    public class StudentScores{
    
    
       public static void main(String[] args) {
    System.out.println("Welcome to the Student Scores Application.");
    
    Scanner input = new Scanner (System.in);
    System.out.println("Enter number of students: ");
    int numStudents = input.nextInt();
    
    List<Student> students = new ArrayList<>();
    
    int counter = 1;
    for(int i = 0; i < numStudents; i++) {
        int studentNum = counter++;
        System.out.println("\nStudent " + studentNum);
        System.out.println("Enter Student Last Name: ");
        String lastName = input.next();
    
        System.out.println("Enter Student First Name: ");
        String firstName = input.next();
    
    
        System.out.println("Enter Student Score: ");
        int score = input.nextInt();
        students.add(new Student(lastName, firstName, score));
    }
    Collections.sort(students);
    System.out.println("Students in alphabetical order: ");
    for (Student s : students) {
        System.out.println(s);       
    }
    System.out.println();
    
    Collections.sort(students, new StudentScoreComparator());
    System.out.println("Students by score:");
    for (Student s : students) {
        System.out.println(s);
    

    } }

    static class Student implements Comparable<Student> 
    

    {

       private  String lastName;
       private String firstName;
       private int scores;
    
        public Student (String lastName, String firstName, int score)
        {
            this.lastName = lastName;
            this.firstName = firstName;
            this.scores = score;
        }
    
        public int getScores()
        {
            return scores;
        }
    
        public String getLastName()
        {
            return lastName;
        }
    
        public String getFirstName()
        {
            return firstName;
        }
    
        @Override
        public int compareTo(Student s)
        {
           if (s.lastName.equals(lastName))
           {
               return firstName.compareToIgnoreCase(s.firstName);
           }
          return lastName.compareToIgnoreCase(s.lastName);
        }
    
        static class StudentScoreComparator implements Comparator<Student>
        {
            @Override
            public int compare(Student o1, Student o2)
            {
                return (Integer.valueOf(o1.getScores())).compareTo(o2.getScores());
            }
        }
        @Override
        public String toString() {
               return String.format("%s %s %d", firstName, lastName, scores);
        }
    

    } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多