2차원 배열에서 최대값과, 최소값을 구하는 두가지 방법을 소개합니다.
기본이 되는 for문과 stream api를 통하여 구해보도록 하겠습니다.
중첩된 For문을 사용하여 최대, 최소 값 구하기
for문을 사용하게 될 경우 명확하고 직관적입니다.
각 행과 열을 반복하여 최대값과 최소값을 비교하여 구할 수 있습니다.
다음은 for문을 사용한 최대값과 최소값을 구하는 예제입니다.
@Test
void givenArrayWhenFindMinAndMaxUsingForLoopsThenCorrect() {
int[][] array = {{8, 4, 1}, {2, 5, 7}, {3, 6, 9}};
int min = array[0][0];
int max = array[0][0];
for (int[] row : array) {
for (int currentValue : row) {
if (currentValue < min) {
min = currentValue;
} else if (currentValue > max) {
max = currentValue;
}
}
}
assertEquals(1, min);
assertEquals(9, max);
}
외부 for문은 2차원 배열의 각 행을 반복하고 다음 내부 for문은 현재 행 내의 각 요소를 반복합니다.
현재 요소가 현재 최소값보다 작은지 또는 최대값보다 큰지 판별하여 최대값과 최소값을 구합니다.
단순하게 실행은 가능하지만 대규모 배열을 사용할 경우 비효율적일 수 있으므로 다른 대안을 고려해야 할 수도 있습니다.
Stream을 사용하여 최대, 최소 값 구하기
Java Stream API는 데이터를 처리하는데 있어 간결하고 선언적인 방법을 제공합니다.
flatMapToInt()매서드를 사용하여 2차원 배열을 단일 요소의 Stream으로 변환할 수 있습니다. 이 매서드는 2차원 배열을 개별 요소의 통합 Stream으로 변환하여 summaryStatistics() 메서드를 사용하여 단일 읽기 가능한 코드 줄에서 최소값과 최대값을 찾을 수 있도록 합니다.
@Test
void givenArrayWhenFindMinAndMaxUsingStreamThenCorrect() {
int[][] array = {{8, 4, 1}, {2, 5, 7}, {3, 6, 9}};
IntSummaryStatistics stats = Arrays
.stream(array)
.flatMapToInt(Arrays::stream)
.summaryStatistics();
assertEquals(1, stats.getMin());
assertEquals(9, stats.getMax());
}
flatMapToInt()매서드로 2차원 배열의 중첩 구조를 개별 요소의 Stream으로 평면화 합니다.
summaryStatistics()매서드를 사용하여 stream을 종료하고 내용의 요약을 생성합니다. 요약된 내용은 최소값, 최대값, 평균, 합계 및 개수를 제공합니다.
summaryStatistics()는 min과 max를 모두 찾는 편리한 방법을 제공하나 stream API에서는 min()매서드와 max()매서드로 전용 매서드를 제공합니다.(최소값 혹은 최대값만 찾을 경우)
Stream 병렬 처리
효율성을 높이기 위해 Stream API와 병렬 처리를 사용할 수 있습니다. 여러 스레드를 사용하여 계산 작업 부하를 분산하여 대규모 배열에서 처리 시간을 줄일 수 있는 가능성이 있습니다.
@Test
void givenArrayWhenFindMinAndMaxUsingParallelStreamThenCorrect() {
int[][] array = {{8, 4, 1}, {2, 5, 7}, {3, 6, 9}};
IntSummaryStatistics stats = Arrays
.stream(array)
.parallel()
.flatMapToInt(Arrays::stream)
.summaryStatistics();
assertEquals(1, stats.getMin());
assertEquals(9, stats.getMax());
}
parallel() 매서드를 활용하여 병렬 처리를 진행합니다.
Stream API 구문은 직관적이지 않을 수 있지만 간결성과 성능 면에서 이점이 있습니다.
간단하고 직관적인 접근 방식을 사용하고 싶을 경우 특히 명확성과 단숭성이 주요한 경우 for문을 사용하고, 간결하고 표현력이 풍부하며 성능이 뛰어난 접근 방식이 필요한 경우, 또는 대규모 배열을 처리할 경우는 Stream API를 사용하는 것이 좋아 보입니다.
출처: https://www.baeldung.com/java-two-dimensional-array-min-max
'Development > Java' 카테고리의 다른 글
[JAVA] Javadoc란 (0) | 2024.08.02 |
---|---|
[JAVA] 효과적인 Logging 14가지 가이드 (0) | 2024.08.01 |
[Spring Boot] Spring Boot Test에서 @Autowried와 @InjectMocks 사용 (0) | 2024.07.29 |
[JAVA] 소수(Decimal)을 분수(Fraction)로 표현하기 (2) | 2024.07.24 |
[JAVA] Stream API에서 NoSuchElementException을 방지하는 방법 (3) | 2024.07.22 |