在二维数组的行之间创建最大值数组

时间:2018-12-24 17:14:38

标签: java java-stream

例如,我创建了一个二维整数数组

int[][] source = new int[][]{
        new int[]{1, 2, 3, 4},
        new int[]{-3, -7, -5, -5},
        new int[]{11, 3, 7, 9},
        new int[]{121, -41, 515, -466}
};

现在我正在创建跨行的最大值数组:

int[] rowMax = new int[source.length];

for (int i = 0; i < source.length; i++) {
  int m = Integer.MIN_VALUE;
  for (int j = 0; j < source[0].length; j++) {
    if (source[i][j] > m) {
      m = source[i][j];
    }
  }
  rowMax[i] = m;
}

这对我来说很好。尝试使用流,我可以找出Finding the max/min value in an array of primitives using Java,在这种情况下

int max = Arrays.stream(arr).max().getAsInt();

并且我可以将内部循环更新为:

int[] rowMax = new int[source.length];
for (int i = 0; i < source.length; i++) {
  rowMax[i] = Arrays.stream(source[i]).max().getAsInt();
}

但是我不确定如何进一步使用流来完成完整的int[] rowMax。可以完全转换吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试更新迭代以迭代Stream<int[]>

Arrays.stream(source) // convert to Stream<int[]>

然后使用您的代码映射,将Stream.mapToInt用作

,以每个int[]的最大值
mapToInt(ints -> Arrays.stream(ints).max().getAsInt())

然后使用IntStream.toArray

将它们收集回数组
toArray()

看起来完全像

int[] rowMax = Arrays.stream(source)
                     .mapToInt(ints -> Arrays.stream(ints).max().getAsInt())
                     .toArray();

恕我直言,尽管这也可以表示为:

int[] rowMax = Stream.of(source) // Stream<int[]> for all rows
                     .mapToInt(ints ->
                             Stream.of(ints)  // Stream<int[]> for each row level
                                     .flatMapToInt(Arrays::stream) // IntStream
                                     .max().orElse(Integer.MIN_VALUE)) // return max per int[] with default value
                     .toArray(); // to array

答案 1 :(得分:1)

您可以执行以下操作:

int[] maxNumbers = Arrays.stream(source) //Stream<int[]>
                         .mapToInt(a -> Arrays.stream(a).max().getAsInt()) // IntStream
                         .toArray();// int[]
  • 通过Arrays.stream(source)从二维数组创建一个流
  • 将每行(int[])映射到最大值
  • 将结果收集到数组