Home > other >  Finding the mode of an array from user input java
Finding the mode of an array from user input java

Time:10-13

So I'm making a program that gets an array from user-inputed values but I'm having trouble writing the code for finding the mode of the array. I tried writing my own code and then tried using a version of someone else's code but that didn't work out because I didn't fully understand it to be honest.

import java.util.Scanner;
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);

    int length; 
    
    Statistics stats = new Statistics();
    System.out.println("Welcome to our statistics program!");
    System.out.print("Enter the amount of numbers you want to store: ");
    length=Integer.parseInt(keyboard.next());   
    int[] nums = new int[length];
    
    for(int i=0; i<length; i  )  {  
      System.out.println("Enter a number: ");
      nums[i]=keyboard.nextInt();  
    }  
    System.out.println("Array elements are: ");  
    for (int i=0; i<length; i  ) {  
      System.out.println(nums[i]);  
    } 
    

public int Mode (int[] nums) { 
    double maxValue = -1.0d;
    int maxCount = 0;

    for(int i = 0; i < data.length; i  ) {
      double currentValue = data[i];
      int currentCount = 1;
      for(int j = i   1; j < data.length;   j) {
        if(Math.abs(data[j] - currentValue) < epsilon) {
            currentCount;
        }
      }
    } 
    if (currentCount > maxCount) {
        maxCount = currentCount;
        maxValue = currentValue;
    } else if (currentCount == maxCount) {
        maxValue = Double.NaN;
        
  }
}

 System.out.println("The minimum number is "   stats.Mode(nums));

CodePudding user response:

You could consider using a HashMap to maintain the frequencies of the values in the array in your loop:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static int getIntegerInput(String prompt, Scanner scanner) {
        System.out.print(prompt);
        int validInteger = -1;
        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                validInteger = scanner.nextInt();
                break;
            } else {
                System.out.println("Error: Invalid input, try again...");
                System.out.print(prompt);
                scanner.next();
            }
        }
        return validInteger;
    }

    public static int getPositiveIntegerInput(String prompt, Scanner scanner) {
        int num = getIntegerInput(prompt, scanner);
        while (num <= 0) {
            System.out.println("Error: Integer must be positive.");
            num = getIntegerInput(prompt, scanner);
        }
        return num;
    }

    public static int getMode(int[] nums) {
        if (nums.length == 0) {
            throw new IllegalArgumentException("nums cannot be empty");
        }
        Map<Integer, Integer> valueFrequencies = new HashMap<>();
        valueFrequencies.put(nums[0], 1);
        int maxFreq = 1;
        int candidateMode = nums[0];
        for (int i = 1; i < nums.length; i  ) {
            int value = nums[i];
            valueFrequencies.merge(value, 1, Integer::sum);
            int candidateFreq = valueFrequencies.get(value);
            if (candidateFreq > maxFreq) {
                candidateMode = value;
                maxFreq = candidateFreq;
            }
        }
        return candidateMode;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int numsLength = getPositiveIntegerInput("Enter how many numbers you want to store: ", scanner);
        int[] nums = new int[numsLength];
        for (int i = 0; i < numsLength; i  ) {
            nums[i] = getIntegerInput(String.format("Enter number %d: ", i   1), scanner);
        }
        int mode = getMode(nums);
        System.out.printf("Mode: %d%n", mode);
    }
}

Example Usage:

Enter how many numbers you want to store: 0
Error: Integer must be positive.
Enter how many numbers you want to store: 6
Enter number 1: 3
Enter number 2: 2
Enter number 3: 5
Enter number 4: 5
Enter number 5: 3
Enter number 6: 3
Mode: 3
  • Related