Ali
Ali

Reputation: 3

Display Min/Max array

The final output will show who has the highest grade and who has the lowest grade. I'm lost on how to call the lowest name/grade to the final output.

In the code I have some comments on where I'm stuck with the "currentMinIndex", the "currentMaxIndex" works just fine and will show it to the final output. I tried to mirror it but it isn't going how I expected. Not sure if something with "(int k = 1; k>= m; k++)" is incorrect.

import java.util.*;

public class MyArrayEX {
    // Sort grades lowest on top
    public static int[] reverseInt(int[] array) {
        int[] input = new int[array.length];
        for (int i = 0, j = input.length - 1; i < array.length; i++, j--) {
            input[j] = array[i];
        }
        return input;
    }

    public static void main(String[] args) {
        // Scanners
        Scanner input = new Scanner(System.in);
        Scanner keyboard = new Scanner(System.in);

        // Input amount
        System.out.print("\nEnter number of students: ");
        int numOfStu = input.nextInt(); // Number of Students 
        int[] grades = new int[numOfStu];
        String[] names = new String[numOfStu];

        // Start loop, amount is based off of "numOfStu"
        for (int i = 0; i < numOfStu; i++) {
            System.out.print("\rEnter student first name: ");
            String name = keyboard.next();

            System.out.print("Enter the students grade: ");
            int grade = input.nextInt();

            // Assigning i
            names[i] = name;
            grades[i] = grade;
            
            //System.out.println("");
        }

        // This is the area that sorts it from least to greatest    
        // i is the indexed value of the last number in array   
        for (int i = grades.length - 1; i > 0; i--) {
            // Resets both to 0 to start at the beginning of the array  
            int currentMax = grades[0];
            int currentMaxIndex = 0;

            // i is back-limit that gets chopped off by one each time   
            for (int k = 1; k <= i; k++) {
                if (currentMax < grades[k]) {
                    currentMax = grades[k];
                    currentMaxIndex = k;
                }
            }

            // This is where im lost on how to call the min value
            // Trying to mirror the one above but using it
            // to show the minimum grade along with the name            
            for (int m = grades.length - 1; i > 0; i--) {
                int currentMin = grades[0];
                int currentMinIndex = 0;
                // Min grades
                for (int k = 1; k >= m; k++) {
                    if (currentMin < grades[m]) {
                        currentMin = grades[m];
                        currentMinIndex = m;
                    }
                }

                // After largest number is found, assign that number to i 
                // Im trying to have the final output show the min/max grade with who has it
                // Would the MinIndex be assigned to a different variable? 
                grades[currentMaxIndex] = grades[i];
                grades[currentMinIndex] = grades[m];
                grades[i] = currentMax;
                grades[m] = currentMin;
                String highName = names[currentMaxIndex];
                String lowName = names[currentMinIndex];
                names[currentMaxIndex] = names[i];
                names[currentMinIndex] = names[m];
                names[i] = highName;
                names[m] = lowName;

                // This shows the name and grade for the highest number
                System.out.print("\rThe highest grade is " + highName + " with a " + currentMax);
                // Unsure how to call this.
                System.out.println("\r and the Lowest grade is " + lowName + " with a " + currentMin); 
            }
        }
        input.close();
        keyboard.close();
    }
}

Upvotes: 0

Views: 111

Answers (1)

Beshambher Chaukhwan
Beshambher Chaukhwan

Reputation: 1448

Your code has multiple problems. First is with the 2 scanners that you are using for same System.in input stream and second you are using nested loops to find the min/max values which is totally unnecessary. Since the question is about finding the min/max so I will focus on that part only and for the scanner I would say remove the keyboard scanner and use only input scanner. Anyways, use the following code block to find the maximum and minimum grades with names:

  int currentMaxIndex = 0;
  int currentMinIndex =  0;

  // Get min max
  for (int i = 1; i<grades.length; i++) { 
     if (grades[currentMaxIndex]<grades[i]) { 
          currentMaxIndex=i;
      }
     if (grades[currentMinIndex]>grades[i]) { 
          currentMinIndex=i;
       }
  }
       
  String highName = names[currentMaxIndex];
  String lowName = names[currentMinIndex];
  int currentMax = grades[currentMaxIndex];
  int currentMin = grades[currentMinIndex];
        
 System.out.print("\rThe highest grade is " + highName + " with a " + currentMax);
 System.out.println("\r and the Lowest grade is " + lowName + " with a " + currentMin);

The approach is quite simple. We first aasume that the first element in the grades array is min and max then we loop to the remaining elements from 1 to grades.length and compare the index min/max to the current index element values and accordingly change our min/max indices. If the current index value is greater than currentMaxIndex then we copy it to currentMaxIndex and same but opposite for currentMinIndex. So in the end we will have the highest and lowest value indices of grades array. The complete code is here https://ideone.com/Qjf48p

Upvotes: 2

Related Questions