在Java 2D数组中查找最小值和最大值

4

我一直在尝试解决这个问题,需要一些帮助。我需要找到多维数组的最小/最大值并将它们打印出来。以下是我尝试过的两种方法。

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;
            }

这个版本在编译时给了我大量的错误。非常感谢您的帮助。


请您将代码正确缩进。 - Andrew Li
2
在每种情况下,你似乎忽略了一个事实,那就是你有一个整数的数组数组。思考一下如何迭代访问data中每个int[]数组中的每个int - Patricia Shanahan
哪个版本的Java批准了在方法内部嵌套方法的使用? - bcsb1001
4个回答

8

我有一个更有趣的解决方案,使用Java 8 :)

IntSummaryStatistics stats = Arrays.stream(data).flatMapToInt(Arrays::stream).collect(Collectors.summarizingInt(Integer::intValue));
int max = stats.getMax();
int min = stats.getMin();

这是一个与你的解决方案不同但实现相同功能的解决方案。首先,我们将2D数组转换为int类型的Stream。为了做到这一点,我们需要先调用flatMapToInt方法,以便以扁平化的方式流式传输数组中的所有元素。想象一下,如果我们只使用单个索引来迭代整个2D数组,就像这样。一旦我们将数组转换为流,我们将使用IntSummaryStatistics来重复使用相同的流进行最小值和最大值计算。

2
方法引用很有趣:x -> Arrays.stream(x) 可以简化为 Arrays::stream - bcsb1001
你知道我觉得很有趣的事情吗?一旦我开始使用Java8,有些东西变得如此...荒谬简单,所需代码也少得多。我想知道在Java 8之前我们是如何编写代码的? - Alexander Petrov
伙计,这看起来简单多了!我想一旦我过了初学者的阶段,将来可以享受更多的乐趣哈哈! - Fancierwhale
1
在示例中有一个小错误,我通过使用IntSummaryStatistics进行了修正。@Fanchen Bao指出流只能被消费一次。因此,我们使用IntSummaryStatistics来避免为最小值和最大值重新创建相同的流。 - Alexander Petrov
2
这段代码对我来说没有起作用,但是经过一个小改变,使用以下代码后它可以工作:Arrays.stream(gameField).flatMapToInt(Arrays::stream).summaryStatistics(); - luckyguy73
1
@luckyguy73 这真的帮了很大忙,不确定Alex是如何让他的代码运行起来的,因为我遇到了和你一样的问题。 - Carlos Medina

5

好的,我稍微修复了你的代码。实际上,你的错误在于没有遍历多维数组的所有单元格。

因此,我在getMinValue/getMaxValue方法中添加了额外的循环,并修正了数组元素的寻址。

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 ;
    }
}

哦,好的,我明白了。非常感谢!这个问题让我抓破了头皮。 - Fancierwhale

0

你的问题是:你在对int数组的数组进行排序,而不是对每个int数组中的每个int进行排序。

要解决这个问题:循环遍历数组中的每个int数组。

使用Arrays.sort()来找到二维int数组的最大值和最小值的步骤:

声明一个名为`data`的二维整数数组以进行排序。 声明两个整数,一个用于保存最大值,另一个用于保存最小值: - 最大值的初始值应为`Integer.MIN_VALUE`,最小值的初始值应为`Integer.MAX_VALUE`,以确保处理负值。 循环遍历`data`从`0`到`data.length`: - 对`data[i]`进行排序。 - 检查`data[i]`的第一个值是否小于最小值,并在是的情况下进行更改。 - 检查`data[i]`的最后一个值是否大于最大值,并在是的情况下进行更改。 输出结果。
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); 
    }
}

我已经能够通过使用一维数组找到值,感谢您详细说明了如何为二维数组声明它! - Fancierwhale

-2
package array;

public class Max_number {
    
    // 2 5 7 9
    // 3 6 8 1
    
    public static void main (String[] arg) {
        int a[][] = {{2,5,7,9},{3,6,8,1}};
        int max=a[0][0];
        for (int i=0; i<2; i++) //row
        {
            for (int j=0; j<4; j++) //coloum
            {
                if(a[i][j]>max)
                {
                    max=a[i][j];
                }
            }
        }
        System.out.println("maximum number is"+max);
    }
}

请不要只贴代码,而是解释这个如何回答问题。 - Sebastian S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接