使用 for 循环找到最小值

Posted

技术标签:

【中文标题】使用 for 循环找到最小值【英文标题】:find minimum value using a for loop 【发布时间】:2016-08-05 13:28:38 【问题描述】:

我正在尝试从用户的输入中获取 10 个整数,并使用 for 循环找到最小值。

我正在努力正确编写if 语句。它应该采用第一个输入并将其设为最小,然后将下一个输入与该输入进行比较。

我的最终打印语句只打印最后输入的数字。

Scanner scan = new Scanner(System.in);

int smallest = 0;
int number = 0;

for (int i = 1; i <= 10; i++) 
   System.out.print("Enter a number > ");
   number = scan.nextInt();

   if (number < smallest) 
       smallest = number; 
    else   
       smallest = number; 
          

System.out.println("The minimum is " + smallest);

【问题讨论】:

【参考方案1】:

有了这个:

if (number < smallest) 
    smallest = number; 
  else   
    smallest = number; 

无论数字是否更小,您总是覆盖最小的值。

完全删除 else 块,它会工作。

编辑 另外:不要使用 0 作为默认值。 将您读取的第一个值作为“原始最小值”

System.out.print("Enter a number > ");
int smallest = scan.nextInt();
  int number = 0;

  for (int i = 1; i <= 9; i++) 
     System.out.print("Enter a number > ");
     number = scan.nextInt();
        if (number < smallest) 
           smallest = number; 
        
  

【讨论】:

只是为了完成您的答案,将最小的初始化为 0 可能会产生不正确的结果。最好将其初始化为最大的整数值。 这是可能的。但是,如果没有元素。为什么不将值初始化为读取的第一个值,然后执行循环? 这将是另一种绕过它的方法。 恕我直言,你想用空整数找到最小值,它应该抛出一个异常。如果你用空集合调用Collections.min(),它会抛出一个NoSuchElementException。因为如果没有元素,用这样的集合调用 min 是没有意义的,会被认为是错误。 @Nier 是的,但在这种情况下,我们不会从可以预先测试的集合或数组开始,在我们设置默认值之前,这将需要对代码进行更大的重构:首先将值读入集合,然后寻找最小的成员。【参考方案2】:

解决方案:删除您的 else 声明。

if (number < smallest) 
    smallest = number; 

没有任何else。使用else,您每次都将smallest 的值设置为输入的值。

【讨论】:

【参考方案3】:

您的一个问题是您从smallest = 0 开始,这意味着只有当其中一个输入小于零时它才会改变。有两种方法可以解决此问题。要么

int smallest = Integer.MAX_VALUE;开头

smallest的更新条件更改为if (number &lt; smallest || i == 1 )

此外,如果if 子句未触发,您不想更新smallest,因此请删除else 块。

【讨论】:

可能是一个想法:不要将 minimum 的值初始化为 Integer.MAX_VALUE。 (如果没有读取 int,则会导致错误的结果)。相反,将其初始化为输入的第一个整数,然后使用循环。 @Stultuske 我的第二个选项等同于您的建议。但是,如果您愿意,请随时发布您自己的答案。 @Stultuske 抱歉,我没有注意到您已经这样做了。但是现在你已经编辑了它,你已经赢得了我的支持。 我也错过了你的第二部分。这确实让我的言论相当......毫无意义:) @DavidWallace 谢谢你的工作。但是,我并不完全理解在条件中添加 i == 1 的作用。你介意简单解释一下吗?【参考方案4】:

两个问题。

1 - 你的 if 应该看起来像这样(删除 else 块):

if (number < smallest) 
 smallest = number; 

2 - 你应该将 minimum 初始化为一个非常大的数字,这样第一个看到的数字总是小于它:

int smallest = Integer.MAX_VALUE;

【讨论】:

使用smallest = Integer.MAX_VALUE。给出一个数值 999999 是个坏主意。【参考方案5】:

试试这样的

Scanner scan = new Scanner(System.in);

int smallest = 0;
int number = 0;

for (int i = 1; i <= 10; i++) 
   System.out.print("Enter a number > ");
   number = scan.nextInt();
   if (i == 1)
       smallest = number;
   
   if (number < smallest) 
       smallest = number; 
   



System.out.println("The minimum is " + smallest);

【讨论】:

【参考方案6】:

这将是我对 smallest 变量进行第一次赋值的偏好。在loop 开始之前,对smallest 进行单独分配。 这样我们就可以准确地知道哪个是分配给smallest 的第一条语句,并且正如其他人之前所说的那样,在loop 中去掉if 语句的else 块。

else 块导致了 OP 所说的打印最后输入的数字的问题。 ñ 现在,由于提示出现在 2 个不同的地方,因此还为“提示”添加了一个字符串变量,以便可以重复使用。注意循环计数从 10 减少到 9,以保持仅提示用户输入 10 次。

    Scanner scan = new Scanner(System.in);

      int smallest = 0;
      int number = 0;
      String prompt = "Enter a number > ";

      // First user prompt
      // and first assignment to 'smallest'
      System.out.print(prompt);
      smallest = scan.nextInt();

      for (int i = 1; i <= 9; i++) 
         System.out.print(prompt);
         number = scan.nextInt();

            if (number < smallest) 
               smallest = number; 
            

      
         System.out.println("The minimum is " + smallest);

【讨论】:

以上是关于使用 for 循环找到最小值的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环中找到最小值并保留它的索引

我想在 for 循环中找到最小值/最大值 [关闭]

Java从for循环中找到最小值

你如何使用 for 循环来找到最小值而不使用类似于 Python 上的“min”的东西?

寻找For循环数组C ++中最大和最小值的值

如何在java中打印数组中的最小值? [复制]