[Java] 객체[Object] List 중복된 ID 목록만 뽑기(추출)

Hyo·2021년 6월 12일
0

블로그 이전

https://kdhyo98.tistory.com

😅서론

알고리즘 문제 때문인가
객체, 리스트, 배열 중복에 관련해서는 대부분 중복 값을 제거하는 설명이 대부분이었다.
가끔가다 중복 값 개수 세기 정도는 있지만 중복 목록만을 뽑는 글은 안 보여서 ... (구글링이 부족할지도)

시작!


😎본론

0. 시나리오

UserList를 받아 저장시킬 때 해당 List 내에 중복된 ID 목록을 return 시켜줘야 한다.
내가 필요한건 객체 내에 중복된 ID를 찾는 것.


00. 객체정보

UserDTO

UserList 생성

aaa - 3번 / bbb - 3번 / ccc - 2번 / ddd - 1번 / eee - 1번


1. 스트림(Stream)과 Set을 사용하기

set과 stream 사용

  • 스트림을 통해 userId 목록만을 가져온다.

  • 새로만든 List 목록을 for문을 돌린다.

  • 아이디마다 indexOf와 lastIndexOf를 통해 각 첫번째 인덱스 번호와 마지막 인덱스 번호가 일치하는지 확인

  • 일치하지 않다면 해당 아이디가 2개 이상 존재하는 것이 때문에 Set에 저장

  • Set은 중복되지 않기 때문에 한 번만 저장되어 중복된 ID 목록을 저장할 수 있다.

결과


2. for문을 한 번 돌아서 가져오기 - List 버전

위에서는 stream으로 idList를 만들고, 다시 반복문을 돌려서 중복체크를 했다.
이번에는 스트림을 사용하지 않고, for문을 한 번만 돌아서 사용한 예제이다.
그렇지만 Set대신 List가 필요할 때.

  • List 객체를 두개 만든다.
    • 1번 : 중복이 된 ID를 저장시키는 List
    • 2번 : ID를 저장해서 중복체크에 사용할 List
  • 검사할 List를 for문돌린다.
  • 2번 List에 ID가 있는지 확인
    • 있다! : 1번 List에 ID가 있는지 체크해서 없다면 1번에 ADD
    • 없다! : 2번에 ADD

결과


3. for문을 한 번 돌아서 가져오기 - Set 버전

2번과 다르게 Set으로 결과값을 얻었다.
Set을 사용하면 2번에처럼 if문을 두 번 사용하는 것이 아닌 한 번만 사용할 수 있다.

결과


4. for문을 한 번 돌아서 가져오기 - Set으로 받아서 List로 변환

이처럼 if문도 한 번이고, Set을 사용해서 List로 다시 형변환을 시킬 수 있습니다.

결과


😉결론

제가 생각해낸 것은 여기까지인데...
1번이 for문을 두 번 돌긴해도 가장 깔끔한 것 같습니다.
더 좋은 방식이 있거나 생각나시면 코멘트로 공유해주시면 감사합니다.
profile
생각중..🤔🤔🤔

1개의 댓글

comment-user-thumbnail
2021년 7월 22일

잘보고 갑니다람쥐~

답글 달기