준호씨의 블로그

Java - distinct. 중복값 제거하기. 고윳값 구하기 본문

개발이야기

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();

결과는 다음과 같이 나옵니다.

홍길동
김삿갓
김개똥

 

 

반응형
Comments