Sorting students by name and score using an array
Solution 1
I think you should change your last line in compareTo as below:
return (new Integer(examScore)).compareTo((new Integer(s.examScore));
or
return Integer.valueOf(examScore).compareTo(Integer.valueOf(s.examScore));
This will compare the two values and return accordingly.
EDIT:
Some corrections in your program:
Add a
toString()
method in yourStudent
class as:@Override public String toString(){ return firstName + " "+ lastName +" : "+examScore; }
Update the
main()
method in app as below:public static void main(String[] args) throws Exception { Scanner aScanner = new Scanner( new FileReader("src//chapt11//ch11AS8data.txt")); System.out.println("Welcome to the Student Scores Application.\n"); int nStudent = 100; Student[] studentArray = new Student[nStudent]; Scanner lineScanner = null; int counter = 0; while (aScanner.hasNext()) { lineScanner = new Scanner(aScanner.nextLine()); String lastName = lineScanner.next(); String firstName = lineScanner.next(); int examScore = lineScanner.nextInt(); System.out.println("Student " + counter + " " + firstName + " " + lastName + " " + +examScore); studentArray[counter++]=new Student(lastName, firstName, examScore); lineScanner.close(); } for(int j = 0; j < counter; j++){ System.out.println(studentArray[j]); } //sort based on first name Arrays.sort(studentArray,0,counter, new Comparator<Student>(){ @Override public int compare(Student s1, Student s2) { return s1.getFirstName().compareTo(s2.getFirstName()); } }); System.out.println("Students sorted by first name in ascending order"); for(int j = 0; j < counter; j++){ System.out.println(studentArray[j]); } //sort based on score Arrays.sort(studentArray,0,counter, new Comparator<Student>(){ @Override public int compare(Student s1, Student s2) { return Integer.valueOf(s1.getExamScore()). compareTo(Integer.valueOf(s2.getExamScore())); } }); System.out.println("Students sorted by score in ascending order"); for(int j = 0; j < counter; j++){ System.out.println(studentArray[j]); } //To compute the average: double sum = 0.0; for(int j = 0; j < counter; j++){ sum+=studentArray[j].getExamScore(); } double average = (sum*1.0)/counter; System.out.println("Average Score = "+average ); aScanner.close(); }
Solution 2
Your mistake is in the last line of the compareTo()
method:
change
return examScore = s.examScore;
to
return examScore - s.examScore;
You want to return a difference, not set your instance variable!
newB
Updated on June 04, 2022Comments
-
newB almost 2 years
I posted a question about this last night but am still struggling. I need to sort a list of students from a text file first by name (in this format last name, first name), and then by test scores. I won't know how many students will be in the text file, other than that there is less than 100. I have to use the compareTo method (which I think I did correctly) and an array (I don't think I'm using this correctly). I have been messing around with this for literally hours on end and I just don't seem to get it. The text book really doesn't seem to be helping me any. How can I get my app class to print sorted student names/grades?
Other spefications are to get the average of the scores and make a comment next to any score below average. Those, however, I can work on after I can get the sorting straightened out.
Here is my code...
package CH11AS8App; import java.io.FileReader; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class kjkkkkkkkkkkk { public static void main( String[] args ) throws Exception { // TODO Auto-generated method stub Scanner aScanner = new Scanner( new FileReader("src//chapt11//ch11AS8data.txt")); int numOfStudents = 100; Student[] studentArray = new Student[numOfStudents]; Scanner sc = null; int counter = 0; while (aScanner.hasNext()) { sc = new Scanner(aScanner.nextLine()); String lastName = sc.next(); String firstName = sc.next(); int score = sc.nextInt(); studentArray[counter++] = new Student(lastName, firstName, score); studentArray[counter] = new Student(lastName, firstName, score); int average= 0; int sum = 0; sum += score; if (counter < numOfStudents); average = sum / counter; if (score <= (average - 10)) { System.out.println("Score 10 points under average"); System.out.println("Student Average:" + average); } sc.close(); // Display Welcome Message System.out.println("Welcome to the Student Scores Application.\n"); //Sort Names Arrays.sort(studentArray,0,counter, new Comparator<Student>(){ @Override public int compare(Student s1, Student s2) { return s1.getLastName().compareTo(s2.getLastName()); } }); System.out.println(); System.out.println("Student list by name:"); System.out.println(); for(int j = 0; j < counter; j++){ System.out.println(studentArray[j]); } //Sort Scores Arrays.sort(studentArray,0,counter, new Comparator<Student>(){ @Override public int compare(Student s1, Student s2) { return Integer.valueOf(s2.getScore()). compareTo(Integer.valueOf(s1.getScore())); } }); System.out.println(); System.out.println(); System.out.println("Student list by score:"); System.out.println(); for(int j = 0; j < counter; j++){ System.out.println(studentArray[j]); } //Close Scanner aScanner.close();
}
static class Student implements Comparable<Student> { //Instance Variables private String firstName; private String lastName; private int score; //Getters & Setters public Student( String firstName, String lastName, int score ) { this.firstName = firstName; this.score = score; this.lastName = lastName; } public int getScore() { return score; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } //CompareTo Method @Override public int compareTo( Student s ) { if( !firstName.equalsIgnoreCase( s.firstName ) ) { return firstName.compareToIgnoreCase( s.firstName ); } if( !lastName.equalsIgnoreCase( s.lastName ) ) { return lastName.compareToIgnoreCase( s.lastName ); } return (new Integer(score)).compareTo((new Integer(s.score))); } @Override public String toString(){ return lastName + ", "+ firstName +" : "+score; } } }