Sorting students by name and score using an array

19,104

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:

  1. Add a toString() method in your Student class as:

    @Override public String toString(){ return firstName + " "+ lastName +" : "+examScore; }

  2. 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!

Share:
19,104
newB
Author by

newB

Updated on June 04, 2022

Comments

  • newB
    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; }
    
    
        }
    
     }