2016-07-09 239 views
0

我一直在试图弄清楚这一点,需要一些帮助。我需要找到最小值/最大值并将它们打印出来用于多维数组。以下是我尝试过的两种方法。在Java 2D数组中寻找最小值和最大值

import java.util.*; 

class MinMax { 
    public static void main(String[] args) { 
     int[][] data = {{3, 2, 5}, 
       {1, 4, 4, 8, 13}, 
       {9, 1, 0, 2}, 
       {0, 2, 6, 3, -1, -8}}; 
     Arrays.sort(data); 
     System.out.println("Minimum = " + data[0]); 
     System.out.println("Maximum = " + data[data.length - 1]); 
    } 
} 

此版本符合但不运行。

import java.util.*; 

class MinMax { 
    public static void main(String[] args) { 
     int[][] data = {{3, 2, 5}, 
       {1, 4, 4, 8, 13}, 
       {9, 1, 0, 2}, 
       {0, 2, 6, 3, -1, -8}}; 

    public static int getMaxValue(int[] numbers) { 
     int maxValue = numbers[0]; 
     for (int i = 1; i < numbers.length; i++) { 
      if (numbers[i] > maxValue) { 
       maxValue = numbers[i]; 
      } 
      return maxValue; 
      { 
       public static int getMinValue (int[] numbers) { 
        int minValue = numbers[0]; 
        for (int i = 1; i < numbers.length; i++) { 
         if (numbers[i] < minValue) { 
          minValue = numbers[i]; 
         } 
        } 
       return minValue; 
      } 

这个版本只是在编译时引发了一堆错误。任何帮助是极大的赞赏。

+0

能否请您缩进代码正确 – Li357

+2

在每一种情况下,你似乎忽略了你有一个阵列的阵列-的-INT的事实。考虑如何迭代访问'data'中每个'int []'数组中的每个'int'。 –

+0

哪个版本的Java合法化方法里面的方法里面的方法? – bcsb1001

回答

2

好的,我已经修好了你的代码。其实你的错误是你没有遍历多维数组的所有单元格。

所以,我已经添加了额外的循环到getMinValue/getMinValue方法和固定的数组元素寻址。

import java.util.*; 

class MinMax { 
    public static void main(String[] args) { 
     int[][] data = { 
       {3, 2, 5}, 
       {1, 4, 4, 8, 13}, 
       {9, 1, 0, 2}, 
       {0, 2, 6, 3, -1, -8} 
     }; 
     System.out.println(getMaxValue(data)); 
     System.out.println(getMinValue(data)); 
    } 


    public static int getMaxValue(int[][] numbers) { 
     int maxValue = numbers[0][0]; 
     for (int j = 0; j < numbers.length; j++) { 
      for (int i = 0; i < numbers[j].length; i++) { 
       if (numbers[j][i] > maxValue) { 
        maxValue = numbers[j][i]; 
       } 
      } 
     } 
     return maxValue; 
    } 

    public static int getMinValue(int[][] numbers) { 
     int minValue = numbers[0][0]; 
     for (int j = 0; j < numbers.length; j++) { 
      for (int i = 0; i < numbers[j].length; i++) { 
       if (numbers[j][i] < minValue) { 
        minValue = numbers[j][i]; 
       } 
      } 
     } 
     return minValue ; 
    } 
} 
+0

哦,好吧,我明白了。非常感谢!我一直在用这种方法拉我的头发 – Fancierwhale

1

我有使用Java 8 :)

IntStream stream = Arrays.stream(data).flatMapToInt(Arrays::stream); 
int max = stream.max().getAsInt(); 
int min = stream.min().getAsInt(); 

它比你的不同的解决方案,显然是一个更有趣的解决方案。但它做同样的事情。首先,我们将2D阵列转换成Streamint s。首先我们需要拨打flatMapToInt。我们这样做是为了以平坦的方式流式传输数组中的所有元素。想象一下,如果我们开始使用单个索引来遍历整个2D数组。这是这样的。一旦我们转换的阵列到一个流,找到最小和最大的元素变成一块蛋糕:)的

+1

方法引用很有趣:'x - > Arrays.stream(x)'可以简化为'Arrays :: stream'。 – bcsb1001

+0

是啊:)我仍在学习:P Thnx! –

+0

你知道我觉得很有趣。一旦我开始做Java8的事情,有些东西只是太简单了,而且需要的代码少得多。我想知道在Java 8之前我们是如何编码的? –

0

您的问题是:正在排序int阵列的阵列,而不是分选在每各单独intint数组。

解决此问题:循环遍历每个int阵列中的int阵列。

说明书查找使用Arrays.sort()二维int阵列的最大和最小:

  1. 声明一个2D int数组进行排序称为data
  2. 声明两个int s,一个保存最大值,另一个最小值。
    • 最大值的初始值应为Integer.MIN_VALUE,最小值的初始值应为Integer.MAX_VALUE以确保处理负值。
  3. 遍历data0data.length
    1. 排序data[i]
    2. 检查的data[i]第一个值小于最小并改变它,如果它是。
    3. 检查data[i]的最后一个值是否大于最大值,如果是,则更改它。
  4. 输出结果。

例子:

import java.util.Arrays; 

public class Main { 
    public static void main(String[] args) { 
     int[][] data = {{3, 2, 5}, 
      {1, 4, 4, 8, 13}, 
      {9, 1, 0, 2}, 
      {0, 2, 6, 3, -1, -8} }; 

     int maximum = Integer.MIN_VALUE; 
     int minimum = Integer.MAX_VALUE; 

     for(int i = 0; i < data.length; i++) { 
      Arrays.sort(data[i]); 

      if(data[i][0] < minimum) minimum = data[i][0]; 
      if(data[i][data[i].length - 1] > maximum) maximum = data[i][data[i].length - 1]; 
     } 

     System.out.println("Minimum = " + maximum); 
     System.out.println("Maximum = " + minimum); 
    } 
} 
+0

我能够弄清楚如何使用一维数组来找到这些值,这要感谢关于如何为二维数组声明它的细节! – Fancierwhale