Skip to content

Commit 5f41a60

Browse files
Reverse Rows of 2d Array in Java (#17228)
* adding reverse rows method and test * adding streams and collections.reverse methods * adds new approaches with deque and collectiosn reverse * adding stream reversal method * adds customized collectors and mappers for reversing rows * fix tests * removing unused dependency * removing commons-lang ArrayUtils references * switching to assertj * fix class and test names
1 parent e5076f9 commit 5f41a60

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.baeldung.array.reversearray;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.Deque;
8+
import java.util.List;
9+
import java.util.stream.Collector;
10+
import java.util.stream.Collectors;
11+
import java.util.stream.IntStream;
12+
import java.util.stream.Stream;
13+
14+
public class ReverseArrayElements {
15+
16+
public static void reverseRowsUsingSimpleForLoops(int[][] array) {
17+
for (int row = 0; row < array.length; row++) {
18+
for (int col = 0; col < array[row].length / 2; col++) {
19+
int current = array[row][col];
20+
array[row][col] = array[row][array[row].length - col - 1];
21+
array[row][array[row].length - col - 1] = current;
22+
}
23+
}
24+
}
25+
26+
public static void reverseRowsUsingNestedIntStreams(int[][] array) {
27+
IntStream.range(0, array.length)
28+
.forEach(row -> IntStream.range(0, array[row].length / 2)
29+
.forEach(col -> {
30+
int current = array[row][col];
31+
array[row][col] = array[row][array[row].length - col - 1];
32+
array[row][array[row].length - col - 1] = current;
33+
}));
34+
}
35+
36+
public static void reverseRowsUsingCollectionsReverse(int[][] array) {
37+
for (int row = 0; row < array.length; row++) {
38+
List<Integer> collectionBoxedRow = Arrays.stream(array[row])
39+
.boxed()
40+
.collect(Collectors.toList());
41+
42+
Collections.reverse(collectionBoxedRow);
43+
44+
array[row] = collectionBoxedRow.stream()
45+
.mapToInt(Integer::intValue)
46+
.toArray();
47+
}
48+
}
49+
50+
public static void reverseRowsUsingCollectionsReverse(List<List<Integer>> array) {
51+
array.forEach(Collections::reverse);
52+
}
53+
54+
static <T> Collector<T, ?, List<T>> toReversedList() {
55+
return Collector.of(
56+
ArrayDeque::new,
57+
(Deque<T> deque, T element) -> deque.addFirst(element),
58+
(d1, d2) -> {
59+
d2.addAll(d1);
60+
return d2;
61+
},
62+
ArrayList::new
63+
);
64+
}
65+
66+
static <T> List<T> reverse(List<T> input) {
67+
Object[] temp = input.toArray();
68+
69+
Stream<T> stream = (Stream<T>) IntStream.range(0, temp.length)
70+
.mapToObj(i -> temp[temp.length - i - 1]);
71+
72+
return stream.collect(Collectors.toList());
73+
}
74+
}
75+
76+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.baeldung.array.reversearray;
2+
3+
import static com.baeldung.array.reversearray.ReverseArrayElements.toReversedList;
4+
import static java.util.Arrays.asList;
5+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
6+
7+
import java.util.List;
8+
import java.util.stream.Collectors;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
class ReverseArrayElementsUnitTest {
13+
14+
@Test
15+
void givenArray_whenCallReverseRows_thenAllRowsReversed() {
16+
int[][] input = new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 2, 1, 3 } };
17+
18+
int[][] expected = new int[][] { { 3, 2, 1 }, { 1, 2, 3 }, { 3, 1, 2 } };
19+
ReverseArrayElements.reverseRowsUsingSimpleForLoops(input);
20+
21+
assertThat(input).isEqualTo(expected);
22+
}
23+
24+
@Test
25+
void givenArray_whenCallReverseRowsUsingNestedIntStreams_thenAllRowsReversed() {
26+
int[][] input = new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 2, 1, 3 } };
27+
28+
int[][] expected = new int[][] { { 3, 2, 1 }, { 1, 2, 3 }, { 3, 1, 2 } };
29+
ReverseArrayElements.reverseRowsUsingNestedIntStreams(input);
30+
31+
assertThat(input).isEqualTo(expected);
32+
}
33+
34+
@Test
35+
void givenArray_whenCallReverseRowsUsingCollectionsReverse_thenAllRowsReversed() {
36+
int[][] input = new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 2, 1, 3 } };
37+
38+
int[][] expected = new int[][] { { 3, 2, 1 }, { 1, 2, 3 }, { 3, 1, 2 } };
39+
ReverseArrayElements.reverseRowsUsingCollectionsReverse(input);
40+
41+
assertThat(input).isEqualTo(expected);
42+
}
43+
44+
@Test
45+
void givenArray_whenCallReverseRowsUsingCollectionsReverseWithList_thenAllRowsReversed() {
46+
List<List<Integer>> input = asList(asList(1, 2, 3), asList(3, 2, 1), asList(2, 1, 3));
47+
List<List<Integer>> expected = asList(asList(3, 2, 1), asList(1, 2, 3), asList(3, 1, 2));
48+
49+
ReverseArrayElements.reverseRowsUsingCollectionsReverse(input);
50+
51+
assertThat(input).isEqualTo(expected);
52+
}
53+
54+
@Test
55+
void givenStreamOf2dArrays_whenMappingWithReverse_thenOutputStreamIsAlsoReversed() {
56+
List<List<Integer>> input = asList(asList(1, 2, 3), asList(3, 2, 1), asList(2, 1, 3));
57+
List<List<Integer>> expected = asList(asList(3, 2, 1), asList(1, 2, 3), asList(3, 1, 2));
58+
59+
List<List<Integer>> result = input.stream()
60+
.map(ReverseArrayElements::reverse)
61+
.collect(Collectors.toList());
62+
63+
assertThat(result).isEqualTo(expected);
64+
}
65+
66+
@Test
67+
void givenStreamOf2dArrays_whenMappingWithCollectReversed_thenOutputStreamIsAlsoReversed() {
68+
List<List<Integer>> input = asList(asList(1, 2, 3), asList(3, 2, 1), asList(2, 1, 3));
69+
List<List<Integer>> expected = asList(asList(3, 2, 1), asList(1, 2, 3), asList(3, 1, 2));
70+
71+
List<List<Integer>> result = input.stream()
72+
.map(a -> a.stream()
73+
.collect(toReversedList()))
74+
.collect(Collectors.toList());
75+
76+
assertThat(result).isEqualTo(expected);
77+
}
78+
}

0 commit comments

Comments
 (0)