😅서론
알고리즘 문제 때문인가
객체, 리스트, 배열 중복에 관련해서는 대부분 중복 값을 제거하는 설명이 대부분이었다.
가끔가다 중복 값 개수 세기 정도는 있지만 중복 목록만을 뽑는 글은 안 보여서 ... (구글링이 부족할지도)
시작!
😎본론
0. 시나리오
UserList를 받아 저장시킬 때 해당 List 내에 중복된 ID 목록을 return 시켜줘야 한다.
내가 필요한건 객체 내에 중복된 ID를 찾는 것.
00. 객체정보
aaa - 3번 / bbb - 3번 / ccc - 2번 / ddd - 1번 / eee - 1번
1. 스트림(Stream)과 Set을 사용하기
- 스트림을 통해 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문을 두 번 돌긴해도 가장 깔끔한 것 같습니다.
더 좋은 방식이 있거나 생각나시면 코멘트로 공유해주시면 감사합니다.
'JVM > Java' 카테고리의 다른 글
[Java] HashMap. stream으로 sum하기 (0) | 2021.09.14 |
---|---|
[JAVA+MSSQL]드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Sever로 보안 연결을 설정할 수 없습니다. - 오류 해결방법 (2) | 2021.07.18 |
[Java] Random보단 SecureRandom 를 사용하자. (2) | 2021.06.06 |
[Java]Collections.emptyList() vs. new instance 어떤 차이가 있을까? (0) | 2021.06.06 |
[Java]for문 List를 Null 체크하는 방법 (0) | 2021.06.06 |