2014-11-02 2 views
0

Я почти закончил с этим проектом. Мне нужна помощь в выяснении, почему он не делает паузу после запроса имени, прежде чем он попросит имя. Я также получаю сообщение об ошибке, когда пытаюсь добавить новый Comparator для сортировки по результату.ArrayList и метод сортировки для имен

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); 
    } 

} }

+1

Я не хочу быть расщепление волос здесь, но Вы указали программу «** магазины результаты в массиве ** ", и вы используете ArrayList. Это нормально? – hfontanez

ответ

0

Я понял свою проблему. Я добавил импорт для метода 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); 
    } 

}}

+0

Это выглядит замечательно, как мой код. –

0

Я считаю, что самый простой подход также сортировать по score является добавление второй класс, который реализует Comparator<Student> как

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); 
} 

Edit 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); 
    } 
} 
+0

На самом деле я постараюсь добавить это. –

+0

@LauraBullard Edited. Код, который вы опубликовали, сортируется по имени (именам). «Компаратор» позволит вам сортировать по количеству баллов. Добавляя 'toString()' to 'Student', вы можете просто перебирать отсортированный массив или список и печатать каждый« Студент ». –

+0

Frisch Я добавил toString на дно под сопоставимым. Это где это должно быть? И что мне делать дальше? Я застрял в том, как закончить эту программу. Вся помощь очень ценится. –

0

Ваш код не использует класс 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); 

Фрагмент кода выше должен находиться внутри вашей петли. На каждой итерации вы записываете полное имя и оценку учащегося и добавляете новый массив Student в массив Student. Как я понял ваше задание, каждый объект Student представляет запись. Массив может (и будет) иметь несколько записей для конкретного ученика, но не обязательно в порядке. Сортировка помогает распечатывать все записи для одного и того же ученика один за другим. Например, индекс 0 массива может быть для «Джо Смит», в то время как индекс 1 может быть для «Энн Джонсон». При сортировке все записи для Энн Джонсон должны быть перечислены первыми, а затем записи Джо Смита.

Для сортировки по имени вам нужно сравнить текущий индекс с другим, если есть один для сравнения. Во-первых, вы должны захватить фамилию и сравнить ее. Если они равны, возьмите первое имя. Если они равны, предположим, что они (записи) предназначены для одного и того же ученика (и вы можете решить в этот момент схватить счет, чтобы сортировать по результату). Если имена разные, записи предназначены для разных студентов, поэтому вы должны выполнить сортировку. Я уверен, что это школьное задание, поэтому используйте один из алгоритмов сортировки, преподаваемых в классе (возможно, тип пузыря) и отсортируйте массив. Скорее всего, вам понадобится несколько проходов для того, чтобы массив был полностью отсортирован по имени и количеству.

Смежные вопросы