如何在java中获取2d数组列表的最大/最小值

时间:2016-12-31 19:28:20

标签: java arrays linq arraylist

我被问到同样的问题c#here我用linq想出你可以轻松地做到这一点。

但是我怎么能简单地这样做,因为在java中没有替代linq的方法?

2 个答案:

答案 0 :(得分:1)

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

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<int[][]>,它将是:

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

答案 1 :(得分: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

但它比简单的循环效果要差,因为你计算了两次总和。

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

// 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);