×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,588,506명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형
ackage com.demo.testing;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "CROCUS";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<Integer> list = createList();

        getUniqueDataByHash(list);
        getUniqueDataByStream(list);
    }

    private List<Integer> createList() {
        List<Integer> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 100; i++) {
            int val = (int) (Math.random() / 10 * 100);
            list.add(val);
        }
        System.out.println("RESULT SIZE : " + list.size());
        System.out.println("RESULT : " + list);

        return list;
    }

    private void getUniqueDataByStream(List<Integer> list) {
        System.out.println("\n== getUniqueDataByStream ==");
        list = list.stream().distinct().sorted().collect(Collectors.toList());
        list.forEach(integer -> System.out.print(integer + " "));
        System.out.println("\n=====");
    }

    private void getUniqueDataByHash(List<Integer> list) {
        ConcurrentHashMap<Integer, Boolean> hashMap = new ConcurrentHashMap<>();
        list.forEach(val -> hashMap.putIfAbsent(val, true));

        System.out.println("\n== getUniqueDataByHash ==");
        hashMap.forEach((integer, aBoolean) -> System.out.print(integer + " "));
        System.out.println("\n=====");
    }
}

 

I/System.out: RESULT SIZE : 100
    RESULT : [3, 9, 7, 0, 8, 2, 0, 1, 6, 9, 6, 5, 3, 4, 1, 5, 6, 6, 5, 4, 4, 5, 5, 8, 0, 8, 5, 7, 4, 3, 9, 7, 7, 1, 9, 9, 3, 4, 2, 5, 8, 7, 7, 9, 6, 6, 2, 9, 9, 9, 7, 6, 2, 8, 2, 9, 3, 8, 9, 0, 7, 7, 5, 3, 9, 4, 1, 4, 9, 3, 6, 4, 8, 2, 4, 8, 7, 1, 1, 5, 6, 4, 1, 3, 3, 1, 9, 9, 7, 5, 9, 3, 9, 9, 4, 8, 5, 8, 2, 6]
I/System.out: == getUniqueDataByHash ==
    0 1 2 3 4 5 6 7 8 9 
I/System.out: =====
    == getUniqueDataByStream ==
I/System.out: 0 1 2 3 4 5 6 7 8 9 
    =====

 

첫번째로는 해싱을 이용하여 중복된 값을 처리하는 방법이다.

이를 이용하면 중복된 값을 피할 수 있게 된다.

    private void getUniqueDataByHash(List<Integer> list) {
        ConcurrentHashMap<Integer, Boolean> hashMap = new ConcurrentHashMap<>();
        list.forEach(val -> hashMap.putIfAbsent(val, true));

        System.out.println("\n== getUniqueDataByHash ==");
        hashMap.forEach((integer, aBoolean) -> System.out.print(integer + " "));
        System.out.println("\n=====");
    }

 

 

Java 8 이상 버전에서는 Stream과  distinct를 이용하여 더 간결하게 중복을 제거 할 수 있다.

    private void getUniqueDataByStream(List<Integer> list) {
        System.out.println("\n== getUniqueDataByStream ==");
        list = list.stream().distinct().sorted().collect(Collectors.toList());
        list.forEach(integer -> System.out.print(integer + " "));
        System.out.println("\n=====");
    }

 

이때 조심해야하는건 List<Object>일 경우에는 object의 hash가 다를 수 있으므로 distinct를하여도 중복된값이 걸러지지 않으니 잘 파악해보도록 하자.

반응형