I have the following two-dimensional arrays :
1 | 5 | 6 | 16| 8 | 9 | 9 | 1 | 3 | 4 | 7 | 6 | 1 | 2 | 4 | 7 | 3 | 8 | int[][] arr = {{1 ,5 ,6 ,16,8 ,9 }, {9 ,1 ,3 ,4 ,7 ,6 }, {1 ,2 ,4 ,7 ,3 ,8 }};
I need to find the maximum value for a specific row and columns, for example for the 1st row, second and 5th column maximum is 8.
Advertisement
Answer
It is convenient to use Stream API for such purposes:
public static int findMax(int from, int to, int row, int[][] arr) { // validate input parameters assert 0 <= row && row < arr.length; assert 0 <= from && from <= to && to < arr[row].length; return Arrays.stream(arr[row]) // IntStream of numbers in the given row .skip(from) // start `from` column .limit(to - from + 1) // check until `to` column .max() // pick max value .orElse(Integer.MIN_VALUE); // if max not found (empty array) }
Test:
int[][] arr = { {1, 5, 6, 7, 8, 9 }, {9, 1, 3, 4, 7, 6}, {1, 2, 4, 7, 3, 8} }; System.out.println(findMax(1, 2, 0, arr));
Output:
6
The same may be implemented using common loops:
public static int findMax(int from, int to, int row, int[][] arr) { assert 0 <= row && row < arr.length; assert 0 <= from && from <= to && to < arr[row].length; int max = Integer.MIN_VALUE; for (int i = from; i <= to; i++) { max = Math.max(max, arr[row][i]); } return max; }
Note: in both examples 0-based array indexes are used for row and columns: 1 refers to the 2nd column, 2 refers to the 3rd column, 0 refers to the 1st row.
Update
As it may be needed to look for maximum in a set of columns (not between the two columns inclusively), it may be implemented as:
public static int findMaxInColumns(int[][] arr, int row, int ... cols) { assert 0 <= row && row < arr.length; return Arrays.stream(cols) // optional filter to prevent ArrayOutOfBoundsException .filter(col -> col >= 0 && col < arr[row].length) .map(col -> arr[row][col]) .max() .orElse(Integer.MIN_VALUE ); }
Test for the same arr
:
System.out.println("max in cols 1, 3, 4: " + findMaxInColumns(arr, 0, 1, 3, 4));
Output:
max in cols 1, 3, 4: 8