List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(1);
list.add(1);
list.add(2);
list.add(3);
list.add(3);
위와 같은 리스트가 있을 때, 중복되는 값을 하나로 통일하고싶었다. 마치 group by 하듯이.
HashSet<Integer> set = new HashSet<Integer>(list);
set.forEach(s -> System.out.println(s));
결과:
0
1
2
3
래퍼클래스의 경우, 위와 같이 간단하게 구현할수 있다.
하지만 리스트의 제네릭이 Dto라면?
package com.devjones.web.javaAlgo.tree;
public class NovelDto {
private String series;
private String novelName;
public String getSeries() {
return series;
}
public void setSeries(String series) {
this.series = series;
}
public String getNovelName() {
return novelName;
}
public void setNovelName(String novelName) {
this.novelName = novelName;
}
@Override
public String toString() {
return "NovelDto [series=" + series + ", novelName=" + novelName + "]";
}
}
NovelDto.java
package com.devjones.web.javaAlgo.tree;
import java.util.ArrayList;
public class HashSetTest01 {
public static void main(String[] args) {
NovelDto nd1 = new NovelDto();
nd1.setSeries("반지의제왕");
nd1.setNovelName("반지 원정대");
NovelDto nd2 = new NovelDto();
nd2.setSeries("반지의제왕");
nd2.setNovelName("반지 원정대");
NovelDto nd3 = new NovelDto();
nd3.setSeries("반지의제왕");
nd3.setNovelName("반지 원정대");
NovelDto nd4 = new NovelDto();
nd4.setSeries("메트로시리즈");
nd4.setNovelName("METRO2033");
NovelDto nd5 = new NovelDto();
nd5.setSeries("메트로시리즈");
nd5.setNovelName("METRO2033");
ArrayList<NovelDto> list = new ArrayList<NovelDto>();
list.add(nd1);
list.add(nd2);
list.add(nd3);
list.add(nd4);
list.add(nd5);
}
}
series를 기준으로 group by 를 하고 싶었다.(원래 디비에서 group by를 하려했으나 모종의 이유로 자바코드에서 진행하게되었다.)
HashSet<String> set = new HashSet<String>();
String series;
Iterator<NovelDto> listItr = list.iterator();
while(listItr.hasNext()) {
series = listItr.next().getSeries();
if(set.contains(series)) { // set에 있다면 해당 row를 삭제한다.
listItr.remove();
}else { // set에 없다면 series이름을 set에 추가한다.
set.add(series);
}
}
list.forEach(novelDto -> System.out.println(novelDto.toString()));
바로 다음줄에 위와같이 작성하였다.
set을 두고 iterator를 돌린다. 해당 series가 set에 있다면 삭제하고 없다면 set에 추가한다.
결과:
NovelDto [series=반지의제왕, novelName=반지 원정대]
NovelDto [series=메트로시리즈, novelName=METRO2033]
더 좋은 방법이 있다면 공유바랍니다.
'자바' 카테고리의 다른 글
[자바] builder 패턴 (0) | 2021.06.03 |
---|---|
[자바] 장식자 패턴 (0) | 2021.06.03 |
[자바] 재귀함수와 증감연산자 (0) | 2021.05.15 |
람다 (0) | 2021.04.05 |
자바에서 제공하는 함수형 인터페이스 (0) | 2021.04.05 |