Java在2d数组中查找最小值和最大值。找到的最小值不正确

时间:2014-12-04 04:35:30

标签: java multidimensional-array min

这是我的代码,其中我声明了一个包含所有值的二维数组,并且我试图让它打印最小值和最大值。最大值向右,但最小值不对。当我运行它时,最大值是9.73(这是正确的),并且最小打印是5.44,这是不正确的,因为如果你查看数组中的值,你会看到5.29是最小值。有谁知道为什么它不能找到正确的最小值?提前谢谢!

public class Test {
  public static double[][] array1 = //array to be used
   {{7.51, 9.57, 6.28, 5.29, 8.7},
    {8.07, 6.54, 5.44, 8.78, 8.66},
    {9.34, 9.73, 7.19, 6.87, 6.48}};
  public static void main(String[] args) {
    double h = array1[0][0];// highest value
    double l = array1[0][0];// lowest value 
    for (int row = 1; row < array1.length; row++){ //find highest value
      for (int col = 1; col < array1.length; col++){
        if (array1[row][col] > h){
         h = array1[row][col]; 
        }
      }
    }
    for (int r = 1; r < array1.length; r++){ //find lowest value
      for (int c = 1; c < array1.length; c++){
        if (array1[r][c] < l){
         l = array1[r][c]; 
        }
      }
    }
    System.out.println(h);//print highest
    System.out.println(l);//print lowest
  }
}

6 个答案:

答案 0 :(得分:2)

我想说,你需要知道两件事

  1. 正如所有人都说索引从0开始。所以在你的两个循环中,它应该从0开始。所以,
  2. for (int row = 0; row < array1.length; row++){

    for (int col = 0; col < array1.length; col++){

    for (int r = 0; r < array1.length; r++){

    for (int c = 0; c < array1.length; c++){

    1. 更重要的一点是,导致您的问题。您正在使用嵌套for循环来访问2D数组。你在写什么,
    2. for (int r = 1; r < array1.length; r++){

      for (int c = 1; c < array1.length; c++){

      你很清楚外部for循环用于行,而内部for循环用于列。

      现在看一下您所使用的值array1.length,这两个循环使用相同的值。如果您尝试打印此内容array1.length,那么您将获得3,因为它是主数组array1的大小。对于外部for循环,这件事是可以的。

      但是内部循环需要工作的次数与每个子数组中的元素一样多(2D数组只是一个数组数组)因此你需要纠正内部for循环的条件,

      for (int col = 0; col < array1[row].length; col++){

      for (int c = 0; c < array1[r].length; c++){

      现在,即使你的内部循环正在进行两次迭代,即1,2为array1.length返回3而你的条件c < array1.length;变为c < 3,因此它只会考虑值{{1}并跳过9.57, 6.28,和其他元素。当您更新此条件时,它将考虑所有值。

答案 1 :(得分:1)

你跳过0指数

for (int r = 0; r < array1.length; r++){ //find lowest value
  for (int c = 0; c < array1.length; c++){

答案 2 :(得分:1)

如果这不是作业并且允许使用Java8,我建议使用一行代码:

double result = Arrays.stream(array1)
    .flatMapToDouble(a -> Arrays.stream(a))
    .min()/max()
    .getAsDouble();

答案 3 :(得分:1)

你在'array

中滑过零索引
class array1{
 public static void main(String args[]){
     double[][] array1 = {{7.51, 9.57, 6.28, 5.29, 8.7},
                          {8.07, 6.54, 5.44, 8.78, 8.66},
                          {9.34, 9.73, 7.19, 6.87, 6.48}};


      double l = array1[0][0];// lowest value 

for (int r = 0; r < array1.length; r++){ //find lowest value
  for (int c = 0; c < array1.length; c++){
   if(r!=0 || c!=0){
     if (array1[r][c] < l){
       l = array1[r][c]; 
     }
   }
   }
  }
System.out.println(l);//print lowest
  }
}

答案 4 :(得分:0)

这是因为你在r和c等于1的情况下开始你的forloop。

for (int r = 1; r < array1.length; r++){ //find lowest value
  for (int c = 1; c < array1.length; c++){

您正在跳过整个第一个阵列。你需要在0开始它们 - 然后一切都会起作用:

for (int r = 0; r < array1.length; r++){ //find lowest value
  for (int c = 0; c < array1.length; c++){

答案 5 :(得分:0)

for (int r = 1; r < array1.length; r++){

Java数组是零索引的,因此完全忽略了第一个数组。从i = 0而不是从1

计数

(对于i,阅读&#34;无论你喜欢什么索引变量&#34; - 我只是每个人都用来计算数组... :)