基于输入寻找最小的整数

3

我有一个任务,需要找到用户输入数字的最小值、最大值和平均值。基本上,他们会输入用空格分隔的正整数,Java会对它们进行遍历并将它们相加。我能够找到总和、平均数和最大整数,但是我无法找到最小值。我认为想要解决这个问题的最好方法是在循环外部将表示最小整数的变量设置为表示最大整数的变量。然后,在循环内部,做类似于以下操作的事情:

        if(getInt < min)
        {
            min = getInt;
        }

getInt是用户输入的值,min是最小整数值。但每次运行时,min都会返回为0。

以下是完整代码:

import java.util.Scanner;

public class exc5
{
    public static void main (String[] args)
    {  
        System.out.println("Write a list of nonnegative integers, each seperated by a space. To signal the end of the list, write a negative integer. The negative integer will not be counted");
        Scanner keyboard = new Scanner (System.in);
        keyboard.useDelimiter(" |\n");

        int count = 0;
        int sum = 0;
        int max = 0;
        int min = max;
        double average = 0;

        boolean notNull = true;

        while(notNull == true)
        {
            int getInt = keyboard.nextInt();

            if(getInt < 0)
            {
                notNull = false;
            }  
            else
            {          
                if(getInt > max)
                {
                    max = getInt;
                }

                if(getInt < min)
                {
                    min = getInt;
                }

                sum += getInt;
                count++;
                average = (sum)/(count);
            }
        }

        System.out.println("Sum = " + sum);
        System.out.println("Average = " + average);
        System.out.println("Max = " + max);
        System.out.println("Minimum = " + min);
    }

}

非常感谢您的帮助!


2
不要将布尔变量与常量进行比较。while(notNull == true) 应该写成 *while(notNull)*。 - m0skit0
请使用Integer.MAX_VALUE来初始化您的min,而不是0。 - VirtualTroll
我重新组织了你的代码并清除了其中的错误。请检查一下。 - Juvanis
8个回答

10

你应该最初将min设置为Integer.MAX_VALUE,将max设置为Integer.MIN_VALUE


我删除了我的回答,试图改进你的回答,以便只有一个好的答案 ;) 对于这个问题有6个答案... 真是毫无用处... - alain.janinm

7

你需要从一个大于0的数开始,而不是0(只有负数小于0)。尝试使用以下代码:

int min = Integer.MAX_VALUE;

这是一个相当标准的模式。另外,为了“正确”,你的代码还应包括:
int max = Integer.MIN_VALUE;

然后处理整数输入的全范围,包括正数和负数。
编辑:
另一种更“经典”的方法是使用对象引用,而不是原始类型(其总是有一个值),因此初始状态可以轻松地区分为null。在这种情况下,对于值使用Integer,而不是int,将允许测试null。如果我是一位大学教授并且在标记这样的工作时,我宁愿看到使用对象的方法-对于原始类型使用最小/最大值确实可以起作用,但这有点儿“技巧性”。
代码如下:
Integer min;

while (...) {

    if (min == null || getInt < min) {
        min = getInt;
    }
}

同样适用于 max


+1 是的,这是每个人都不可避免遇到的问题之一,所以一旦你看到症状,就不需要阅读代码就能知道答案 :) - Sergey Kalinichenko
@dasblinkenlight 喜欢这个昵称!我太老了,甚至知道它来自哪里 :) - Bohemian
@Bohemian,感谢您的回答!虽然我选择了另一个更详细的答案作为正确答案,但我真的非常感激您的回答! - Andrew De Forest

3
这是:

        int max = 0;
        int min = max;

min 初始化为零。毕竟,max 还没有成为最大的整数。

                if(getInt < min)

永远不会成立。尝试更改这个:
        int min = max;

转换为:

        int min = Integer.MAX_VALUE; // largest possible Java `int`

感谢您清晰的解释和回答!我会在几分钟内接受 :) - Andrew De Forest

1

这是因为您正在将min赋值为0,所以除非您输入一个小于0的数字,否则最小值为0。您应该将min初始化为Integer.MAX_VALUE。

int min = Integer.MAX_VALUE;

(或者也可以是:

int min = 0xFFFFFFFF;

只是为了瞎搞 :P。使用第一个!:)


1

你将min初始化为0。尝试使用Integer.MAX_VALUE进行初始化,即最好这样做:

int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;

否则,您的检查:
if(getInt < 0)

将会跳出循环,你永远不会再走到0。


1

您的程序完全可用且已经过“清理”:

import java.util.Scanner;

public class exc5
{
    public static void main ( String [] args )
    {
        Scanner keyboard = new Scanner( System.in );
        int count = 0;
        int sum = 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        double average = 0;
        boolean notNull = true;

        while ( notNull == true )
        {
            int getInt = keyboard.nextInt();

            if ( getInt < 0 )
                notNull = false;
            else
            {
                if ( getInt > max )
                    max = getInt;

                if ( getInt <= min )
                    min = getInt;

                sum += getInt;
                count++;
            }
        }

        average = ( sum ) / ( count );

        System.out.println( "Sum = " + sum );
        System.out.println( "Average = " + average );
        System.out.println( "Max = " + max );
        System.out.println( "Minimum = " + min );
    }

}

1

你将min设置为零,因此(由于输入是正数),没有任何输入小于min

通常的做法是将max的初始值设置为Integer.MIN_VALUE,将min的初始值设置为Integer.MAX_VALUE

这确保了任何输入值都会影响至少一个minmax - 通常是两者!


1

你将min设置为0作为起点,因此getInt永远不会更小。你应该在循环开始时设置min,这样就可以解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接