【问题标题】:Why my code compare only first and last number of array - Java为什么我的代码只比较数组的第一个和最后一个数字 - Java
【发布时间】:2019-08-26 16:20:41
【问题描述】:

我想获得数组的最小数量,但我的“if”比较只检查数组的第一个和最后一个位置。

这是我的代码:

int[] randNumbers = new int[20]; //deklaracja nowej tablicy 20-elementowej

Random r = new Random(); // Dodana metoda random do losowania

for(int i=0; i<randNumbers.length; i++) {
    randNumbers[i] = r.nextInt(101);
    int min = randNumbers[0];

    System.out.println("Number "+i+": " +  randNumbers[i]);


    if (randNumbers[i] < min) {
        min = randNumbers[i];
    }
    if (i == randNumbers.length-1) {
        System.out.println("Min number is: " + min);
    }
}

【问题讨论】:

    标签: java arrays random min


    【解决方案1】:

    你甚至不需要这里的数组。只需从 0 迭代到 N 并检查每个随机数是否小于 min:

    Random r = new Random();
    int min = 101;    // assign max value 101 before loop
    
    for(int i = 0; i < 20; i++) {
        int number = r.nextInt(101);
        System.out.println("Number " + i + ": " +  number);
        if (number < min) {
            min = number;
        }
    }
    System.out.println(min);   
    

    如果你想使用数组,你可以先初始化它。例如使用Random.ints():

    int[] randNumbers = new Random().ints(20, 0, 101).toArray();
    

    然后使用与randNumbers[i] 相同的for-loop 想法而不是nextInt(101)

    【讨论】:

      【解决方案2】:

      试试这个,你的 int min = randNumbers[0]; 每次都会重置最小值,所以把它移出循环

      int min = 100;
      for(int i=0; i<randNumbers.length; i++) {
          randNumbers[i] = r.nextInt(101);
          System.out.println("Number "+i+": " +  randNumbers[i]);
          if (randNumbers[i] < min) {
                min = randNumbers[i];
          }
      }
      System.out.println("Min number is: " + min);
      

      【讨论】:

        【解决方案3】:

        问题是您不记得循环运行时的最小数字。如果你在循环之外创建一个变量,它不会在每次迭代中更新。您的代码可能如下所示:

        int[] randNumbers = new int[20]; //deklaracja nowej tablicy 20-elementowej
        Random r = new Random(); // Dodana metoda random do losowania
        int min = 0;
        
        for(int i=0; i<randNumbers.length; i++) {
            int number = r.nextInt(101);
            if(i == 0) min = number;
            randNumbers[i] = number;
            System.out.println("Number "+i+": " + number);
        
            min = Math.min(min, number);
        }
        
        System.out.println("Min number is: " + min);
        

        需要注意的几点:

        • 变量min 被移出循环。这是为了确保它在整个循环中保持不变,并且不会在循环的每次迭代中更新。
        • 引入了一个新变量number。这是为了防止你不断地调用randNumbers[i],它看起来更好,而且据我所知稍微加快了它的速度。它还可以更轻松地更改一次变量,并使其在需要的任何地方都有效。
        • 最后一个S.O.P 已移出循环。如果您可以将语句放在循环结束后的行,那么检查循环是否位于最后一个元素是没有意义的。它的功能相同,但看起来更好。
        • 它不使用if 语句来设置最小值,而是使用Math.min 的输出。这只是表面上的更改,其行为与 if 语句完全相同。

        【讨论】:

        • 在第 3 行 int min = randNumbers[0],randNumber[0] 尚未分配有意义的值。因此,将未初始化的值分配给 min 可能会改变结果的有效性......
        • @geneSummons 完全忘记了这一点!感谢您接受它:)
        • 另外,正如其他答案中提到的,在集合中搜索最小值的“标准”方法是以最大可能值作为默认最小值开始。因此,int min = Integer.MAX_INT 将是一个比零更惯用的默认最小值。
        • ^这是我寻找的解决方案。非常感谢:) @geneSummons 不知道 int min=Integer.Max_Int 的选项
        • @Hugoniasty 我不好,根据 Javadocs,静态字段实际上是 Integer.MAX_VALUE 而不是 MAX_INT
        【解决方案4】:
        1. Move min int outside loop with value 0 不起作用,因为我的结果每次都是因为未初始化的数组只有 '0'
        2. 将其移动 100+ 是个好主意。当我们知道最大数量时,它就起作用了。
        3. @geneSummons "int min = Integer.MAX_INT" 这适用于不同的数字范围/范围:)谢谢

        顺便说一句。我仍然不明白为什么它只比较第一个和最后一个数字;)

        【讨论】:

        • if (randNumbers[i] &lt; min) 将每个i 索引值与最小值进行比较,而不仅仅是第一个和最后一个。你到底有什么不明白的?您是否使用调试器单步执行您的代码?
        猜你喜欢
        • 2021-05-26
        • 1970-01-01
        • 2016-07-30
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多