[JAVA] 순서가 없는 컬렉션 중복 제거

이대건·2024년 3월 9일

Java

목록 보기
12/17
post-thumbnail

원시 타입은 값 비교를 통해, 클래스는 eqauls와 hashcode를 통해 동등성을 비교한다. 그렇다면 순서가 없는 컬렉션의 중복은 어떻게 제거하는지 알아보자.

상황

  • {1,2,3}, {1,3,2}, {2,1,3}, {2,3,1}, {3,1,2}, {3,2,1}
  • 위 순열을 하나의 경우로 세고 싶을 때 같은 것을 포함하는 순열을 적용하여 1, 2, 3을 모두 같은 수로 취급하여 아래 공식을 적용하면 된다.

(원소 개수)!/(같은 원소의 개수!)

  • 하지만 어떤 원소를 같은 원소로 취급할 지를 매번 계산해야 하는 경우가 발생한다.
    • 프로그래머스-불량 사용자

결론부터

  • 결론부터 말하자면 상위 Set이 하위 Set의 equals를 호출하도록 코드를 작성하면 된다

Set < E >

  • 기본적인 중복 제거는 set을 통해 진행한다.
  • 순열을 리스트에 저장한 뒤 Set에 add 한다해도 리스트는 순서가 존재하기 때문에equals의 쓸모가 없다.
  • 만약 순서가 있고 중복을 제거하고 싶다면 아래 코드를 사용하면 되지만 같은 순열을 중복해서 계산한다는 것은 코드가 잘못되었을 가능성이 높으니 유의하여 사용해야한다.
	Set<List<E>> set = new HashSet<>();
    list1 = {1,2,3}
    list2 = {1,2,3}
    set.add(list1);
    set.add(list2);
    // set.size() == 1;
    
    list3 = {3,2,1}
    set.add(list3);
    // set.size() == 2;

Set< Set< E >>

  • 순서가 없는 컬렉션은 집합과 연관있다.
  • 다만 부모 Set에 추가하는 자식 Set의 정보가 바뀔 수 있으므로 꼭 새로운 객체를 생성한뒤 값을 복사하여 추가하길 바란다
	Set<Set<E>> set = new HashSet<>();
    Set<E> subset1 = new HashSet<>();
    subset1.add("A");
    subset1.add("B");
    // subset1 = ["A", "B"]
    
    set<E> subset2 = new HashSet<>();
    subset2.add("B");
    subset2.add("A");
    // subset2 = ["B", "A"]
	// 편의상 순서를 나눈 것 뿐 내부적으로는 순서가 없다.

    Set<E> copiedSet1 = new HashSet<>(subset1);
    Set<E> copiedSet2 = new HashSet<>(subset2);
    set.add(copiedSet1);
    set.add(copiedSet2);
    // set.size() == 1;

결론

  • Set의 equals를 활용하여 순서가 없는 컬렉션의 중복을 제거할 수 있다.
profile
일낸머스크

0개의 댓글