이 문서의 내용
더보기
배열의 중복 Element 제거는 알고리즘 문제에서 자주 사용하는 로직입니다.
중복 제거 방법은 크게 Set 자료구조를 사용한 방법과 Stream의 함수를 사용하는 방법이 있습니다.
Set 자료 구조를 사용한 방법
java.util.Set<E>을 구현하는 HashSet을 사용합니다. Set 자료구조는 중복된 값을 가지지 않는 Collection입니다.
Java의 Set은 중복된 값을 다시 입력했을 때 Exception을 발생시키지 않고 무효하게 처리합니다.
결과적으로 단순히 모든 값을 Set에 입력하는 것만으로도 중복 제거가 가능합니다.
// 중복 제거하는 배열입니다.
String[] input = new String[] { "H", "E", "L", "L", "O", "W", "O", "R", "L", "D", "!" };
Set<String> filtered = new HashSet<>(Arrays.asList(input));
String[] output = filtered.toArray(new String[filtered.size()]);
// 중복 제거 결과를 출력합니다.
System.out.println(Arrays.toString(output));
코드 | 비고 | |
중복 제거하는 배열을 사용해 |
||
HashSet을 다시 |
입력된 코드의 출력 결과를 확인합니다.
[!, R, D, E, W, H, L, O]
더보기
HashSet은 순서가 없는 Collection이기 때문에 기존 정렬을 유지하지는 않습니다.
기존 배열의 순서를 보장하려면 LinkedHashSet을 사용합니다.
[H, E, L, O, W, R, D, !]
Stream을 사용한 방법
Java 8부터는 Stream을 사용 할 수 있습니다. Stream을 사용하면 구현된 코드를 간결하게 구성 할 수 있습니다.
// 중복 제거하는 배열입니다.
String[] input = new String[] { "H", "E", "L", "L", "O", "W", "O", "R", "L", "D", "!" };
String[] output = Arrays.stream(input).distinct().toArray(String[]::new);
// 중복 제거 결과를 출력합니다.
System.out.println(Arrays.toString(output));
코드 | 비고 | |
배열을 사용해 |
||
Stream에서 |
||
Stream 객체를 다시 |
입력된 코드의 출력 결과를 확인합니다. 예시의 LinkedHashSet처럼 기존 배열의 순서 역시 보장합니다.
[H, E, L, O, W, R, D, !]
더보기
distinct()는 Stream에 저장된 객체 간 중복 검사를 위해 Object.equals(Object)를 호출합니다.
public boolean equals(Object obj) {
return (this == obj);
}
정리 및 복습
- 배열에서 Element 중복을 제거하려면
Set또는Stream을 사용합니다. - Set은
중복된 값을 허용하지 않는 Collection입니다. - Set에
단순히 모든 값을 Set에 입력하는 것만으로도 중복 제거가 가능합니다. Set을 구현하는 자료구조는 HashSet과 LinkedHashSet이 있습니다.
Set | HashSet | LinkedHashSet |
중복된 값을 허용하지 않습니다. |
중복된 값을 허용하지 않습니다. |
- Stream의
distinct()를 사용하면 Stream에 저장된 값의 중복을 제거합니다. - Stream은
Java 8부터 사용 할 수 있습니다.
'Java > Java SE, EE' 카테고리의 다른 글
Windows에서 OpenJDK 17 버전 설치 (0) | 2023.12.27 |
---|---|
배열 int[]와 Integer[]간에 상호 캐스팅하기 (0) | 2023.12.07 |
Azure AD와 MSAL4J를 사용한 SSO(Single Sign-On) 로그인 인증 구현 (0) | 2023.11.28 |
데이터 표현을 위한 Record 클래스 (0) | 2023.11.27 |
macOS에서 OpenJDK 17 버전 설치 (0) | 2023.11.07 |