【问题标题】:How to find min and max values for a randomized array, max works but for some reason the min doesn't如何找到随机数组的最小值和最大值,最大值有效,但由于某种原因最小值不
【发布时间】:2022-08-13 22:10:54
【问题描述】:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    int [] intNumbers = new int [10];
    
    int intSmallest = intNumbers[0];
    int intLargest = intNumbers[0];
    
    for (int i = 0; i< intNumbers.length; i = i +1) {
       intNumbers[i] = (int) (Math.random()*100);
       
       //if (intNumbers[i] < intSmallest) intSmallest = intNumbers[i]; 
    }

    jLabel5.setText(Arrays.toString(intNumbers));
     
    for (int i = 0; i< intNumbers.length; i++) {
        if (intNumbers[i] > intLargest) {
            intLargest = intNumbers[i];
        }
        if (intNumbers[i] < intSmallest) {
            intSmallest = intNumbers[i];
        }
    }
  
    System.out.println(intLargest);
    System.out.println(intSmallest);
}

出于某种原因,最大值有效,但最小值不起作用,即使它们几乎是相同的代码。

  • “它不起作用”是什么意思?请明确点。此外,所有 java swing 的东西都是分散注意力的,对这个问题没有必要,所以不要只是盲目地复制粘贴。最后,在随机设置数组中的值(介于 0 到 100 之间)之前,将 min 初始化为数组的第一个元素(即 0)。当然,所有这些值都不小于 0,因此最小值为从未更新。

标签: java arrays max min


【解决方案1】:

您正在将 smallestlargest 初始化为零。在循环之后移动这些初始化和声明。

for (int i = 0; i< intNumbers.length; i = i +1) {
   intNumbers[i] = (int) (Math.random()*100);               
}
int intSmallest = intNumbers[0];
int intLargest = intNumbers[0];    

接下来,我建议Math.maxMath.min 以及for-each 循环用于第二个循环。喜欢,

for (int val : intNumbers) {
    intLargest = Math.max(intLargest, val);   
    intSmallest = Math.min(intSmallest, val);
}

【讨论】:

    【解决方案2】:

    将 intNumbers 设置为随机值后,需要将 intSmallest 和 intLargest 重新初始化为 intNumbers[0] 以将确切的第一个随机数设置为 anwer 变量。

    像这样的东西:

    int [] intNumbers = new int [10];//all array elements are 0
        
        int intSmallest = intNumbers[0];///okay here intNumbers[0] is 0
        int intLargest = intNumbers[0];
        
        for (int i = 0; i< intNumbers.length; i = i +1) {
          // here intNumbers[0] gets a new value which can be less than 0
           intNumbers[i] = (int) (Math.random()*100);
           
           //if (intNumbers[i] < intSmallest) intSmallest = intNumbers[i]; 
                
            
        }
         intSmallest = intNumbers[0];// seed the smallest and biggest 
         intLargest = intNumbers[0];//you could also move the decleretion here... 
        jLabel5.setText(Arrays.toString(intNumbers));
         
        for (int i = 0; i< intNumbers.length; i++) {
            
            if (intNumbers[i] > intLargest) {
                intLargest = intNumbers[i];
            }
            if (intNumbers[i] < intSmallest) {
                intSmallest = intNumbers[i];
            }
        }
        
      
        System.out.println(intLargest);
        System.out.println(intSmallest);
    }
    

    【讨论】:

      【解决方案3】:

      以下代码有效。 我发现的一件事是 intSmallest 和 intLargest 的初始化。 一开始并不清楚会生成哪些值。 因此,将 intSmallest 设置为区间的最大值,将 intLargest 设置为区间的最小值。 (如果区间的最大值和最小值不明确,则将两者都设置为第一个生成的值,就在生成第一个值之后)。

      public class Main
      {
          public static void main(String[] args) {
              int [] intNumbers = new int [10];
          
          int intSmallest = 100;
          int intLargest = 0;
          
          for (int i = 0; i< intNumbers.length; i = i +1) {
             intNumbers[i] = (int) (Math.random()*100);
          }
      
          // edit: better as described above
          intSmallest=intNumbers[0];
          intLargest=intNumbers[0];
          // end of edit
      
           
          for (int i = 0; i< intNumbers.length; i++) {
              System.out.println("number "+i+" is "+intNumbers[i]);
              if (intNumbers[i] > intLargest) {
                  intLargest = intNumbers[i];
              }
              if (intNumbers[i] < intSmallest) {
                  intSmallest = intNumbers[i];
              }
          }
          
        
          System.out.println("Largest is "+intLargest);
          System.out.println("Smallest is "+intSmallest);
      
          }
      }
      

      输出:

      number 0 is 16
      number 1 is 90
      number 2 is 41
      number 3 is 71
      number 4 is 57
      number 5 is 5
      number 6 is 11
      number 7 is 72
      number 8 is 32
      number 9 is 17
      Largest is 90
      Smallest is 5
      

      我还想指出,此类问题通常可以通过在各个步骤之间打印值来简单地解决,例如在循环内(而不是仅打印最终结果)。然后你可以看到“某事”出了什么问题。

      【讨论】:

        【解决方案4】:

        为什么

        intSmallest 被赋值为 0。除非 intNumbers 在循环后包含小于或等于 0 的值,否则 intSmallest 将始终为 0。

        如何

        方法一:

        在循环之后移动 intSmallest 初始化。

            for (int i = 0; i< intNumbers.length; i = i +1) {
               intNumbers[i] = (int) (Math.random()*100);
               
               //if (intNumbers[i] < intSmallest) intSmallest = intNumbers[i]; 
            }
        
            int intSmallest = intNumbers[0];
        

        方法二:

        先排序intNumbers ,最小值为intNumbers[0] ,最大值为intNumbers[intNumbers.length - 1]

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            int [] intNumbers = new int [10];
            
            for (int i = 0; i< intNumbers.length; i = i +1) {
               intNumbers[i] = (int) (Math.random()*100);
            }
        
            jLabel5.setText(Arrays.toString(intNumbers));
             
            Arrays.sort(intNumbers);
        
            System.out.println(intNumbers[intNumbers.length - 1]); // intLargest
            System.out.println(intNumbers[0]); // intSmallest
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-09
          • 2018-08-01
          • 2018-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-01
          • 1970-01-01
          相关资源
          最近更新 更多