【问题标题】:How to get max/min of list of 2d array in java如何在java中获取二维数组列表的最大值/最小值
【发布时间】:2016-12-31 19:28:19
【问题描述】:

我被问到关于 c# here 的相同问题,我发现使用 linq 可以轻松做到这一点。

但是我怎么能简单地做到这一点,因为在 java 中没有 linq 的替代品?

【问题讨论】:

  • 似乎是重复的问题。参考这个链接->stackoverflow.com/questions/29452190/…
  • 您可以使用排序算法,使数组的第一个元素为最小值,最后一个元素为最大值。如果您将数组转换为 List,您还可以考虑使用 lambda 表达式。
  • 这是一个很好的初学者编程问题。你为什么不试一试?首先从一维数组开始。
  • @Teja 我不这么认为,我有一个二维数组列表
  • @LoganKulinski 我做了第一个解决方案,不幸的是我的 IDE 不支持 lanbda 表达式。

标签: java arrays linq arraylist


【解决方案1】:

如果你想要类似于 LINQ 的东西,你可以使用 Java8 流来做到这一点:

// prepare arrays
List<int[][]> kidsL = new ArrayList<>();
int[][] square1 = new int[8][8];
int[][] square2 = new int[8][8];
int[][] square3 = new int[8][8];
for (int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++) {
        square1[i][j] = 1;
        square2[i][j] = 2;
        square3[i][j] = 3;
    }
kidsL.add(square1);
kidsL.add(square2);
kidsL.add(square3);

// find min
kidsL.stream()
        .mapToInt(a -> Arrays.stream(a).flatMapToInt(Arrays::stream).sum())
        .min()
        .ifPresent(System.err::println);

// find max
kidsL.stream()
        .mapToInt(a -> Arrays.stream(a).flatMapToInt(Arrays::stream).sum())
        .max()
        .ifPresent(System.err::println);

打印出来:

64
192

但它不如简单的 for 循环有效,因为你计算了两次总和。

当然你可以添加中间操作来存储和列表,然后根据它计算最小值/最大值。

// intermediate list of sums
List<Integer> sums = kidsL.stream()
        .mapToInt(a -> Arrays.stream(a).flatMapToInt(Arrays::stream).sum())
        .boxed().collect(Collectors.toList());

sums.stream().mapToInt(i -> i)
        .min()
        .ifPresent(System.err::println);

sums.stream().mapToInt(i -> i)
        .max()
        .ifPresent(System.err::println);

【讨论】:

  • 谢谢。这正是我想要的。但不幸的是,IDE(处理环境)不支持 lambda 表达式……所以我想我应该寻求其他解决方案。
【解决方案2】:

如果数组未排序,找到最小值和最大值的唯一真正方法是遍历整个数组。

int[][] array = new int[10][10];
int min = array[0][0];
int max = array[0][0];
for(int i = 0; i < array.length; i++){
    for(int j = 0; j < array[0].length; j++){
        if(array[i][j] < min){
            min = array[i][j];
        }
        if(array[i][j] > max){
            max = array[i][j];
        }
    }
}  

我刚刚重读了这个问题,我认为您的意思是 ArrayList&lt;int[][]&gt;,即:

ArrayList<int[][]> arrayList = new ArrayList<int[][]>();

int min = arrayList.get(0)[0][0];
int max = arrayList.get(0)[0][0];

for(int[][] array : arrayList){
    for(int i = 0; i < array.length; i++){
        for(int j = 0; j < array[0].length; j++){
            if(array[i][j] < min){
                min = array[i][j];
            }
            if(array[i][j] > max){
                max = array[i][j];
            }
        }
    }
}

【讨论】:

  • 但这并不是我想要的。(我需要将每个二维数组的总和存储在一个列表中,然后在该列表中找到最大值和最小值)。但是经过一些修改,多亏了你,我解决了我的问题
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2018-09-14
  • 2016-06-21
  • 2011-03-04
相关资源
最近更新 更多