javaarraysfilearraylistmin

Finding minimum and maximum grade from a List of students


I have to find the minimum and maximum first grade from a List of students and then write those values into an output file with only the first name.

I tried to picture this problem as a matrix of values, where each row corresponds to a Student and each column to their fields (name, last name, etc.). I've tried to read the students into an ArrayList and then transfer their float grades from the Arraylist into an array using a for loop but it's not working.

does anyone know how to do this?

public class student implements Comparable<student>{
       
private String fname;
private String lname;
private String major;
private float grades1;    
private float grades2; 
private float grades3;   

public String getfname() {return fname;}
public String getlname() {return lname;}
private String getmajor() {return major;}
public float getg1() {return grades1;}
public float getg2() {return grades2;}
public float getg3() {return grades3;}

public student(String f,String l,String m,float g1,float g2, float g3)  {  
    fname=f;
    lname=l;
    major=m;
    grades1=g1;
    grades2=g2;
    grades3=g3;
     
}
}
 public static void main (String[]args) throws IOException
  {
      
    PrintWriter pw1 = new PrintWriter ("input.txt");
      pw1.println ("Mickey Mouse CS 98.7 67.8 23.5");
      pw1.println ("Minnie Mouse ENG 45.6 98.3 94.7");
      pw1.println ("Donald Duck NET 56.8 74.2 78.4");
      pw1.println ("Bob Builder CS 78.5 89.4 82.5");
      pw1.println ("Snow White MAT 56.6 32.4 56.6");
      pw1.println ("Hellen Keller CHEM 78.8 23.1 99.6");
      pw1.println ("Daffy Duck ENG 67.4 55.5 89.5");
      pw1.println ("Fred Flinstone MAT 45.3 87.4 38.9");
      pw1.println ("Daffy Duck CS 76.5 22.2 88.5");
      pw1.println ("Bugs Bunny NET 68.4 89.7 95.6");
      pw1.println ("Winnie Pooh CHEM 77.5 89.4 98.2");
      pw1.close ();
    PrintWriter pw2 = new PrintWriter ("input2.txt");
      pw2.println ("Scrooge McDuck ACC 78.7 77.3 63.5");
      pw2.println ("Woody Woodbecker CS 65.6 78.3 84.7");
      pw2.println ("Scooby Doo MAT 56.8 78.2 88.4");
      pw2.println ("Spider Man CHEM 58.5 99.3 92.5");
      pw2.println ("Roger rabbit NET 66.9 39.6 86.6");
      pw2.println ("Wonder Woman CHEM 68.4 83.1 69.6");
      pw2.println ("Jane Jetson ENG 77.4 85.5 69.5");
      pw2.close ();

      File in = new File ("input.txt");
        java.util.ArrayList < student > list = uploadStudents (in);


         float[] gg = new float[list.size()];
         for (int i = 0; i < list.size(); i++)
            gg[i] = he.getg1();

float min = gg[0];
    for (int i = 0; i < gg.length; i++) {
        if (gg[i] < gg[0]) {
            gg[0] = gg[i];
        }
    }  

}
 public static ArrayList < student > uploadStudents (File inputfilename) throws IOException ///
  {
    java.util.ArrayList < student > student = new java.util.ArrayList <> ();



    Scanner sc = new Scanner (inputfilename);

    while (sc.hasNext ())
      {
    //new student object??
    student s =
      new student (sc.next (), sc.next (), sc.next (), sc.nextFloat (),
               sc.nextFloat (), sc.nextFloat ());
      student.add (s);
      }



    return student;

  } 



//I want a float[] gg array to be the one that starts with 78.88

I've tried to use a for loop, but apparently it just copies all the values into gg[0]; which is not good because I also have to find the minimum of each column of the ArrayList` and then print output them in a file with the min and max of each grade and their name.


Solution

  • If I understood correctly your problem, you're trying to represent your list of students as a matrix of values where each row represents a student and each column one of their fields.

    You don't need to map the students to a matrix to find the ones with the minimum and maximum grade. You can already achieve that with the list of students you have.

    Just iterate the list with a basic for loop starting from the second element. The first student would be marked as the one with both the minimum and maximum grade. Then, at every iteration, check whether the minimum and maximum students have respectively a higher and lower grade than the ones you're currently iterating.

    Lastly, in case you want to find the students with the minimum and maximum grade among the three grades they have, you could define in the Student class the methods getMinimumGrade() and getMaximumGrade() to respectively return the lowest and greatest grades among the three.

    Student

    class Student {
    
        //your implemenyation
    
        //Method to get the lowest grade among the three
        public float getMinimumGrade() {
            return Math.min(Math.min(grades1, grades2), grades3);
        }
    
        //Method to get the greatest grade among the three
        public float getMaximumGrade() {
            return Math.max(Math.max(grades1, grades2), grades3);
        }
    }
    

    Partial Main Implementation

    File in = new File("input.txt");
    ArrayList<Student> listStudents = uploadStudents(in);
    
    Student studentMinGrade = null;
    Student studentMaxGrade = null;
    
    if (listStudents.size() > 0) {
        //Assuming that the first student corresponds to the student with both minimum and maximum grade
        studentMinGrade = listStudents.get(0);
        studentMaxGrade = listStudents.get(0);
    
        for (int i = 1; i < listStudents.size(); i++) {
    
            //Checking if the current student has a grade lower than the minimum student
            if (listStudents.get(i).getMinimumGrade() < studentMinGrade.getMinimumGrade()) {
                studentMinGrade = listStudents.get(i);
            }
    
            //Checking if the current student has a grade higher than the maximum student
            if (listStudents.get(i).getMaximumGrade() > studentMaxGrade.getMaximumGrade()) {
                studentMaxGrade = listStudents.get(i);
            }
        }
    }
    
    PrintWriter pw = new PrintWriter("output.txt");
    
    //Printing the student with the minimum grade
    if (studentMinGrade != null) {
        pw.print(String.format("Student with minimum grade: %s => %f%n", studentMinGrade.getfname(), studentMinGrade.getMinimumGrade()));
    }
    
    //Printing the student with the maximum grade
    if (studentMaxGrade != null) {
        pw.print(String.format("Student with maximum grade: %s => %f", studentMaxGrade.getfname(), studentMaxGrade.getMaximumGrade()));
    }
    
    pw.close();
    

    The previous snippet could also be re-written in a more concise way with streams.

    Partial Main with Stream Implementation

    File in = new File("input.txt");
    ArrayList<Student> listStudents = uploadStudents(in);
    
    Student studentMinGrade = listStudents.stream()
            .min(Comparator.comparingDouble(Student::getMinimumGrade)) //Finding the student with the lowest grade
            .orElse(null); //Retrieving the student or null if non has been found
    
    Student studentMaxGrade = listStudents.stream()
            .max(Comparator.comparingDouble(Student::getMaximumGrade)) //Finding the student with the greatest grade
            .orElse(null); //Retrieving the student or null if non has been found
    
    PrintWriter pw = new PrintWriter("output.txt");
    
    //Printing the student with the minimum grade
    if (studentMinGrade != null) {
        pw.print(String.format("Student with minimum grade: %s => %f%n", studentMinGrade.getfname(), studentMinGrade.getMinimumGrade()));
    }
    
    //Printing the student with the maximum grade
    if (studentMaxGrade != null) {
        pw.print(String.format("Student with maximum grade: %s => %f", studentMaxGrade.getfname(), studentMaxGrade.getMaximumGrade()));
    }
    
    pw.close();