칸타피앙
1k
2016-08-04 13:24:09
13
1712

리스트 비교 질문좀 드리겠습니다.


A 리스트에는 1,2,3,4,5

B 리스트에는 3,5,6 가 있습니다.

결과 1,2,3,4,5,6

여기서 A리스트에 B리스트의 내용을 넣어줄려고 하는데 중복된 값은 못넣게 할려고 합니다.

contains을 이용해봣는데 주소값이 달라서 중복값된 내용은 제외처리가 안되서 

어떻게 해야 할지 모르겠습니다..;;; 

0
0
  • 답변 13

  • 안양일번가
    1k
    2016-08-04 13:26:13

    그냥 a에 다 넣어버린다음에 중복제거하면 되지 않을까요

    0
  • zepinos
    19k
    2016-08-04 13:44:20

    중복제거 이슈는 Set 으로 처리하는게 나을 수 있습니다. 어짜피 합치게 되면 순서가 흐트러지므로 정렬을 따로 한 번 해줘야 한다고 감안하면, HashSet 으로 두 개의 값을 그냥 집어만 넣어도 결과처럼 중복제거가 된 상태가 됩니다.

    이런 방식의 최대 장점은, 병합할 자료의 수가 아주 많아지면 효율이 매우 좋다는데 있습니다.

    0
  • 칸타피앙
    1k
    2016-08-04 14:00:01

    현재 리스트에 값들은 DAO를 참조해서 가지고 오는거라 주소값이 제각각 다릅니다.

    같은 내용이라도 주소값이 다 달라서 hashset이나 contains등을 사용해도 먹히질 않네요..;;; 

    0
  • shalom
    148
    2016-08-04 14:04:57

    http://kimeunseokit.tumblr.com/post/76965317535

    여긴 어떠신가요~

    0
  • kkey21a
    3k
    2016-08-04 14:11:16

    저도 zepinos 님 의견 처럼 Set구현체를 이용하시는 방법을 추천드립니다. 

    알고리즘 자체의 특성을 이용해 그냥 삽입만 하시면 됩니다.


    그건 그렇고 ArrayList contains 함수는 내부적으로 Object 자체 equals 비교를 하기에 각각의 ArrayList의 주소값과는 큰 상관이 없어 보입니다. 소스 다시 한번 확인해 보세요.

    Ex) A, B LIST 

    C SUM LIST

    가 있으면 A, B 데이터를 C에 넣기 전에 C.contains 확인 후 하나씩 넣으시면 될 것 같습니다.

    0
  • zepinos
    19k
    2016-08-04 14:11:19

    primitive 가 아닌 Object 라면 contains 가 아니라 직접 값 비교를 통해서 처리할 수 밖에 없겠지요.

    0
  • kkey21a
    3k
    2016-08-04 14:23:43

    zepinos님//

    primitive 가 아닌 Object 라면 contains 가 아니라 직접 값 비교를 통해서 처리할 수 밖에 없겠지요.

    말이 조금 이상합니다 ㅠ

    아무튼 딴지는 아닙니다.


    PS: primitive Type이면 직접 비교(=)를 하고 Object면 contains 함수 사용하시면 됩니다. 이 말이신듯?


    0
  • 제타건담
    6k
    2016-08-04 14:23:46

    저도 제피노스님 의견에 동의합니다..

    어차피 여러개의 객체들을 담아야 하는 Collection을 사용해야 하는 거라면..

    차라리 Set 인터페이스를 구현한 Collection 클래스들을 사용하는게 낫죠..

    다만 그럴려면 해당 객체의 equals 메소드를 구현해야 합니다..

    primitive 타입일 경우 직접 들어가는지..아니면 해당 primitive 타입과 매핑되는 클래스로 자동으로 변환되어서 들어갈지..아니면 수동으로 변환해야 하는지는 테스트 해봐야 합니다만..

    일단 저도 Set 구조에 한표..던집니다..

    0
  • kkey21a
    3k
    2016-08-04 14:35:34

    ※ 아래 List에 각각 중복된 데이터가 있을 때

    A = new ArrayList();

    B = new ArrayList();


    1. ArrayList

    C  = new ArrayList();

    C.addAll(A);

    for (Object a : B) {

        if (C.contains(a) == false) {

            C.add(a);

        }

    }


    2. Set

    D = HashSet();

    D.addAll(A);

    D.addAll(B);


    개인적으로는 2번 코드 추천드립니다.


    PS: 개인적으로는 퍼포먼스, 메모리 이런 부분보다 간략한 코드가 좋은 것 같습니다. 물론, 속도도 위와같은 상황이라면 데이터가 많아질수록 HashSet이 유리할겁니다.

    0
  • 칸타피앙
    1k
    2016-08-04 14:41:39

    아 처리 됫습니다. a랑b랑 비교해서 b에서 중복된 값 제거해주고 add시켜주니까 되네요;;;ㅋㅋ


    이 간단한걸 머리 굴리느라 고생햇네요 ㅋㅋ;;

    0
  • zepinos
    19k
    2016-08-04 15:28:34

    kkey21a 님 // Object 타입에서 Object 가 달라도 값이 같을 경우 언급한 방법으론 중복 제거가 안됩니다. 제가 질문자의 의도를 정확히 파악했는지 모르겠지만,


    I i1 = new I();

    I i2 = new I();

    i1.setX("1");

    i2.setX("1");

    A.add(i1);

    B.add(i2);


    그리고 합쳤을 때 i1 이나 i2 중 하나는 사라져야 한다는게 질문자의 의도 같습니다. 그래서 Object 타입에선 contains 가 아닌 값 비교가 필요하다는 댓글을 남긴 것입니다. 당연히 primitive 에선 이런 건 의미 없지만요.


    0
  • kkey21a
    3k
    2016-08-04 15:31:40

    zepinos님//

    그런 말씀이셨군요. 하나 배워 갑니다.

    0
  • jslovers
    2k
    2016-08-05 11:26:47

    equals를 override하고,

    LinkedHashSet을 이용하면 될 것 같습니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.