본문 바로가기

자바

List의 중복제거, HashSet

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