I need to use the comparable interfact and a compareTo method to sort a list of students alphabetically and then by test score. I'm struggling at getting this to work in my application.
The list of names needs to be read from a text file. I don't know how many names will be in the text file that my professor uses except that it will be less than 100. I am also supposed to display the average of the grades at the bottom as well as write a message next to any student that is 15 points below average. I have not really gotten to the writing message part as I am currently stuck on getting the names and scores to print and sort.
The text file should look something like this:
Steelman Andrea 95
Murach Joel 98
Lowe Doug 82
Murach Mike 93
This is what I have so far... if someone could give me a little direction I'd appreciate it. Thank you.
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;
}
}
}
Firstly, delete entirely your
Comparable
interface. UseComparable
from the JDK.Change your code to this
Note also that there is no "else" after a conditional
return
, so I omitted that redundant part of the codeThere are few things that needs correction in your code:
Student
class is inner class so to create object of that class you need first object of outer class. You probably wanted nested class that objects can be created without outer object (just addstatic
modifier toStudent
class)Arrays.sort()
object must implementjava.lang.Comparable
interface, not interface created by you.You can use generics with
Comparable<T>
so try implementing yourStudent
class withimplements Comparable<Student>{
this way yourcompareTo
method will can likeinstead of:
Since your array will contain nulls (its default value for not filled places) you need to prevent sorting comparator from invoking
compareTo
on null element. To do it useArrays.sort(Object[] a, int fromIndex, int toIndex)
version of sorting algorithm.Check again your logic while collecting informations from file. To make things easier don't do few things at once. First collect all data, then do statistics.