개발이야기
Java - distinct. 중복값 제거하기. 고윳값 구하기
준호씨
2020. 8. 7. 23:22
반응형
Java에서 List에 있는 값들 중 중복 값을 제거하는 방법을 알아보겠습니다. 고윳값을 구하는 방법입니다.
Set으로 변경하기
가장 쉬운 방법으로 Set으로 변경하는 방법입니다. Set은 중복을 허용하지 않기 때문에 List에 있는 값들을 Set으로 넣어 주면 중복 값을 쉽게 제거할 수 있습니다.
List<String> list = Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥");
HashSet<String> set = new HashSet<>();
for (String name : list) {
set.add(name);
}
for (String name : set) {
System.out.println(name);
}
결과
김삿갓
홍길동
김개똥
set.add를 하는 루프는 addAll 메서드 하나로 줄일 수 있습니다.
List<String> list = Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥");
HashSet<String> set = new HashSet<>();
set.addAll(list);
for (String name : set) {
System.out.println(name);
}
생성자에서 처리하면 한 줄 더 줄일 수 있습니다.
List<String> list = Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥");
HashSet<String> set = new HashSet<>(list);
for (String name : set) {
System.out.println(name);
}
출력은 forEach를 사용하면 더 줄 일 수 있습니다. forEach는 java8 이상에서 사용할 수 있습니다.
List<String> list = Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥");
HashSet<String> set = new HashSet<>(list);
set.forEach(System.out::println);
생성한 set과 출력문을 하나로 합칠 수 있습니다.
List<String> list = Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥");
new HashSet<>(list).forEach(System.out::println);
그런데 이 방법은 살짝 가독성이 떨어지는 느낌이라 별로 좋아 보이지는 않습니다.
guava
google guava 라이브러리로 list를 생성하고 set으로 변경하는 방법입니다.
Sets.newHashSet(Lists.newArrayList("홍길동", "김삿갓", "홍길동", "김개똥"))
.forEach(System.out::println);
결과
김삿갓
홍길동
김개똥
stream api
java8부터는 stream api를 이용할 수 있습니다. stream api에는 distinct라는 메서드를 제공하고 있습니다.
Arrays.asList("홍길동", "김삿갓", "홍길동", "김개똥").stream()
.distinct()
.forEach(System.out::println);
결과는 다음과 같습니다. set으로 했을 때와는 순서는 좀 다르게 나옵니다.
홍길동
김삿갓
김개똥
Arrays.asList(...). stream()는 Stream.of로 줄일 수 있습니다.
Stream.of("홍길동", "김삿갓", "홍길동", "김개똥")
.distinct()
.forEach(System.out::println);
reactor
reactor api를 사용한다면 Flux에 있는 distinct() 메서드를 이용할 수 있습니다.
Flux.just("홍길동", "김삿갓", "홍길동", "김개똥")
.distinct()
.doOnNext(System.out::println)
.subscribe();
결과는 다음과 같이 나옵니다.
홍길동
김삿갓
김개똥
반응형