본문 바로가기

Programming

[자바]ArraylIst에서 중복 제거하는 7가지 방법

반응형

2022-02-13 update

최고로 빠른 중복제거

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        ArrayList<String> resultList = new ArrayList<String>();
        for (String temp : input) {
            if (!resultList.contains(temp)) {
                resultList.add(temp);
            }
        }
        return resultList;
    }

중복을 제거하는 7가지 방법들

1. 로직을 이용한 중복 제거

import java.util.ArrayList;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        ArrayList<String> resultList = new ArrayList<String>();
        for (String temp : input) {
            if (!resultList.contains(temp)) {
                resultList.add(temp);
            }
        }

        return resultList;
    }

2. HashSet을 이용한 중복제거

import java.util.ArrayList;
import java.util.HashSet;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        return new ArrayList<String>( new HashSet<String>(input));
    }

3. TreeSet을 이용한 중복제거

import java.util.ArrayList;
import java.util.TreeSet;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        return new ArrayList<String>(new TreeSet<String>(input));
    }

4. Google guava를 이용한 중복제거

google guava github link

import java.util.ArrayList;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        return Lists.newArrayList(Sets.newHashSet(input));
    }

5. stream(Java 8 이상만 사용가능)을 이용한 중복제거

import java.util.ArrayList;
import java.util.stream.Collectors;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        return (ArrayList<String>) input
                .parallelStream()
                .distinct()
                .collect(Collectors.toList());
    }

6. LinkedHashSet 이용한 중복제거

import java.util.ArrayList;
import java.util.LinkedHashSet;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        return new ArrayList<String>(new LinkedHashSet<String>(input));
    }

7. 로직을 이용한 중복제거2

import java.util.ArrayList;

 

    private static ArrayList<String> rmDupliArrayList(ArrayList<String> input) {
        ArrayList<String> resultList = new ArrayList<String>(input);

        for (int i = 0; i < resultList.size(); i++) {
            for (int j = i+1; j < resultList.size(); j++) {
                if (resultList.get(j).equals(resultList.get(i))) {
                    resultList.remove(i);
                }
            }
        }
        return resultList;
    }

측정 방법

public class Main {
    public static void main(String[] args) {
        ArrayList<String> dataList = new ArrayList<String>();
        ArrayList<String> resultList = new ArrayList<String>();
        dataList.add("1111");
        dataList.add("2222");
        dataList.add("3333");
        dataList.add("3333");
        dataList.add("aaaa");
        dataList.add("bbbb");
        dataList.add("eeee");
        dataList.add("bbbb");
        dataList.add("안녕");
        dataList.add("안녕?");
        dataList.add("안녕");
        dataList.add("이건 코드가 아니다");
        int x = 0;
        while (x < 10000) {
            long starttime = System.nanoTime();
            /*시작점 시간 저장*/
            /*----------중복제거------*/
            resultList = rmDupliArrayList(dataList);
            /*----------중복제거------*/
            long endtime = System.nanoTime();
            /*모든 코드가 실행되고 시간 저장*/
            long estimatedTime = endtime - starttime;
            /*시작점과 끝점을 계산하여 걸린 시간 측정*/
            System.out.println(estimatedTime);
            /*걸린시간을 출력*/
            ++x;
        }
        System.out.println(resultList);
        /*중복제거가 잘 되었는지 확인*/
    }

10000번 루프문으로 실행 결과를 모아서 평균을 낸다.

측정결과

결론

중복제거에만 한정하여 로직문이 제일 좋다.
(몇몇 방법의 경우 자동 정렬까지 되므로 더 효율적일수 있다. 실험 필요)

추가

5년전 2017

2022

 

 

난 이 실험을 대략 5년전에도 했는데, 순위는 변한게 없지만, 컴퓨터의 기본 속도 자체가 엄청나게 달라졌다는걸 확 체감할수 있었다.
심지어, 5년전에 한 실험은 천번을 반복했고. 이번엔 만번을 반복시켰는데도 말이다.

 

 

반응형