【问题标题】:How to get the minimum and maximum value inside a user-defined array?如何获取用户定义数组中的最小值和最大值?
【发布时间】:2021-01-11 09:20:27
【问题描述】:

我想获取数组中的最小值和最大值。用户输入n个数组后,将打印该数组内的最小值和最大值。

这是一个示例输出

这是我目前的代码

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try {
            System.out.println("Enter array size: ");
            int n = input.nextInt();

            int [] array = new int[n];
            int max = getMaxValue(array);
            int min = getMinValue(array);

            System.out.println("Enter " + n + " elements:");
            for (int i = 1; i <= array.length; i++) {
                array[i] = input.nextInt();
            }

            System.out.println("Max Value: " + max);
            System.out.println("Min Value: " + min);

        } catch (InputMismatchException e) {
            System.out.println("INVALID INPUT >> PLEASE INPUT A NUMBER");
        }
    }

    private static int getMaxValue(int[] array) {
        int maxValue = array[0];
        for (int i = 1; i < array.length; i++){
            if (array[i] > maxValue){
                maxValue = array[i];
            }
        }
        return maxValue;
    }

    private static int getMinValue(int[] array) {
        int minValue = array[0];
        for (int i = 1; i < array.length; i++){
            if (array[i] < minValue) {
                minValue = array[i];
            }
        }
        return minValue;
    }
}

【问题讨论】:

  • 问题出在哪里?
  • 您必须在要求用户输入后计算最大值和最小值,而不是之前。
  • 您还应该将 try/catch 放在更靠近输入的位置。按照您现在的方式,如果他们输入格式错误的文本,它会中断循环。
  • 当我运行程序时,它没有显示数组中的最大值和最小值。例如,输入n个数组后,程序结束,但不显示最小值和最大值
  • 它不显示数组中的最大值和最小值 - 因为当您调用 min/max 方法时,该数组不包含任何值。

标签: java arrays max minimum


【解决方案1】:

有一些问题使该程序无法正常工作:

  1. getMinValue 和 getMaxValue 应该在输入循环之后调用
  2. 所有 3 个循环索引都从 1 开始,它们应该从 0 开始
  3. 输入循环重复直到i &lt;= array.length,但它应该在i &lt; array.length结束

问题1是这些方法是在空数组上调用的。 问题 2 和 3 将导致 ArrayIndexOutOfBoundsException。

以下是代码中更正后的样子:

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try {
            System.out.println("Enter array size: ");
            int n = input.nextInt();

            int [] array = new int[n];

            System.out.println("Enter " + n + " elements:");
            for (int i = 0; i < array.length; i++) {
                array[i] = input.nextInt();
            }
            int max = getMaxValue(array);
            int min = getMinValue(array);

            System.out.println("Max Value: " + max);
            System.out.println("Min Value: " + min);

        } catch (InputMismatchException e) {
            System.out.println("INVALID INPUT >> PLEASE INPUT A NUMBER");
        }
    }

    private static int getMaxValue(int[] array) {
        int maxValue = array[0];
        for (int i = 0; i < array.length; i++){
            if (array[i] > maxValue){
                maxValue = array[i];
            }
        }
        return maxValue;
    }

    private static int getMinValue(int[] array) {
        int minValue = array[0];
        for (int i = 0; i < array.length; i++){
            if (array[i] < minValue) {
                minValue = array[i];
            }
        }
        return minValue;
    }
}

【讨论】:

    【解决方案2】:

    您的代码中有 3 个问题如下:

    1. int max = getMaxValue(array) int min = getMinValue(array) 在错误的地方被调用

    当我们初始化一个 int 数组时,它的默认值是0。 因此,当您调用 getMaxValue()
    array[0] = 0 与数组中的所有其余值(0)进行比较,并且所有 0 都是最大值。
    getMinValue() 也是如此。

    1. 您调用了函数getMaxValue()getMinValue(),但没有填充数组,而是使用用户输入。 您应该使用来自 0 to array.length 的 for 循环。
        for(int index = 0 ; index < array.length ; index++){
           array[index] = input.nextInt();
        }
    
    1. 你有没有注意到,我有index 盯着0 to array size。 你做了什么:
    for (int i = 1; i <= array.length; i++) {
       array[i] = input.nextInt();
     }
    

    这将导致 ArrayIndexOutOfBoundException 因为数组索引从 0 to n-1 开始,并且您允许它运行到 1 to n

    此外,可以在一个函数中找到最小值和最大值。 通过将返回类型保持为数组。

    public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            try {
                System.out.println("Enter array size: ");
                int n = input.nextInt();
    
                int [] array = new int[n];
                
                System.out.println("Enter " + n + " elements:"); // <-- changed
                for (int i = 0; i < array.length; i++) {
                    array[i] = input.nextInt();
                }
                
                int max_min[] = getMax_MinValue(array); // <- notice this.
                
                System.out.println("Max Value: " + max_min[0]);
                System.out.println("Min Value: " + max_min[1]);
    
            } catch (InputMismatchException e) {
                System.out.println("INVALID INPUT >> PLEASE INPUT A NUMBER");
            }finally {
                input.close(); // close the scanner 
            }
        }
    
        // return type changed 
        private static int[] getMax_MinValue(int[] array) {
           
            int maxValue = array[0];
            int minValue = array[0];
           
            for (int i = 0; i < array.length; i++){
    
                if (array[i] > maxValue){
                    maxValue = array[i];
                }
                if(array[i] < minValue) {
                    minValue = array[i];
                }
    
            }
            
            int min_max[] = {maxValue,minValue}; // min_max[0] has max value and min_max[1] has min value
            return min_max;
        }
    

    输出:

    Enter array size: 
    8
    Enter 8 elements:
    5
    23
    9
    14
    45
    36
    42
    39
    Max Value: 45
    Min Value: 5
    

    【讨论】:

      【解决方案3】:

      这不是一个合适的答案。

      但是,getMaxValuegetMinValue 的实现有一个小缺陷:空数组会引发 ArrayIndexOutOfBoundException

      尤其是可能会使用 Stream 类。

      private static int getMaxValue(int[] array) {
          return IntStream.of(array).max().orElse(0);
      }
      
      private static int getMinValue(int[] array) {
          return IntStream.of(array).min().orElse(0);
      }
      

      maxmin 生成 OptionalInt,对于空数组,可以给出默认值 (orElse)。

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2010-11-23
        • 2011-08-16
        • 2017-12-13
        • 1970-01-01
        • 2021-02-14
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多