Java

[Java] List 중복 제거하기

📝 작성 : 2020.07.09  ⏱ 수정 : 
728x90

List 중복제거

List는 기본적으로 중복을 허용합니다. 하지만 때때로 필요에 따라 List의 중복을 제거해야 할 때가 있습니다.
오늘은 List의 중복을 제거하는 방법에 대해 알아보겠습니다.

public class ListDistinct {
    public static void main(String[] args) {
        List<String> before = new ArrayList<>();
        before.add("1");
        before.add("1");
        before.add("2");
        before.add("3");
        before.add("3");
        before.add("4");
        before.add("7");
        before.add("6");
        before.add("6");
        before.add("5");
        before.add("5");
        before.add("5");

        List<String> byLogic = getDistinctByLogic(before);
        System.out.println("byLogic : " + byLogic);
        System.out.println("-----------------");
        List<String> byHashSet = getDistinctByHashSet(before);
        System.out.println("byHashSet : " +byHashSet);
        System.out.println("-----------------");
        List<String> byTreeSet = getDistinctByTreeSet(before);
        System.out.println("byTreeSet : " + byTreeSet);
        System.out.println("-----------------");
        List<String> byStream = getDistinctByStream(before);
        System.out.println("byStream : " + byStream);
    }

    public static List<String> getDistinctByLogic(List<String> list) {
        List<String> result = new ArrayList<>();
        for (String str : list) {
            if (!result.contains(str))
                result.add(str);
        }
        return result;
    }

    public static List<String> getDistinctByHashSet(List<String> list) {
        HashSet<String> tmp = new HashSet<>(list);
        List<String> result = new ArrayList<>(tmp);
        return result;
    }
    public static List<String> getDistinctByTreeSet(List<String> list) {
        TreeSet<String> tmp = new TreeSet<>(list);
        List<String> result = new ArrayList<>(tmp);
        return result;
    }
    public static List<String> getDistinctByStream(List<String> list) {
        List<String> result = new ArrayList<>();
        //result = list.stream().distinct().collect(Collectors.toList());
        result = list.parallelStream().distinct().collect(Collectors.toList());
        return result;
    }
}


결과

byLogic : [1, 2, 3, 4, 7, 6, 5]
-----------------
byHashSet : [1, 2, 3, 4, 5, 6, 7]
-----------------
byTreeSet : [1, 2, 3, 4, 5, 6, 7]
-----------------
byStream : [1, 2, 3, 4, 7, 6, 5]


반복문과 stream을 이용한 방법은 정렬이 되지 않고 HashSet, TreeSet을 이용한 방법은 정렬되는 것을 볼 수 있습니다.

List => Set으로 들어갈 때 정렬된 채로 들어가는걸로 보입니다. 자세한 건 좀 더 연구해봐야겠습니다.

성능은 반복문 > HashSet > TreeSet > Stream 순이라고 합니다. (실험 사이트)

반응형

'Java' 카테고리의 다른 글

[Java] 람다  (0) 2020.07.12
[Java] String.split(".")  (0) 2020.07.11
[Java]Immutable Object(불변객체)  (0) 2020.07.03
[Java] String = ""; vs new String("");  (0) 2020.07.01
[Java] 배열을 ArrayList로 변환  (0) 2020.06.30