본문 바로가기

자바

자바 List에서 중복된 Custom class 제거 하기

자바로 개발을 할 적에, 주로 List를 많이 사용합니다.

그러나, 자바 List는 중복을 허용합니다. 이러한 중복을 어떻게 하면 손쉽게 제거 가능할까요?

특히, List 안에 내가 만든 Custom Class를 담고 있다고 하면 어떠한 방식으로 할 수 있을까요?


아래와 같이 2가지만 기억하시면 됩니다.

1. HashSet

2. project lombok 라이브러리를 이용한 equals() / hashCode() 메소드 구현 (아래 URL 참조)

http://projectlombok.org/features/EqualsAndHashCode.html


바로 예제로 들어가보도록 하죠.

먼저, 중복을 제거하기 위해서 우리가 만든 List 객체를 HashSet 안에 넣어서 자동으로 중복을 제거하도록 합니다. 

이 때, HashSet 내에서 List 안에 들어 있는 Custom 객체 (e.g., ProxyBean) 가 서로 중복인 지 판단하기 위해서 equals()와 hashCode() 메소드들을 사용합니다.

우리가 중복인 지 판단하고자 하는 부분은 각 Custom 객체 내에 있는 값들(e.g., ip, port, type)이 같을 경우에 중복인 것으로 판단하고자 합니다.

그렇기 때문에, 기본으로 내장된 equals()와 hashCode()를 사용하면, 객체에 대한 값이 나오기 때문에 우리가 원하는 판단을 할 수가 없습니다. 실제로, ip, port, type이 같음에도 불구하고 중복되지 않은 객체로 판단을 합니다.

이걸 일일이 구현하기는 힘들기 때문에, 여기서 project lombok 라이브러리를 사용합니다.

간단히, @EqualsAndHashCode annotation만 넣어주면 끝~!


Main.java

 List<ProxyBean> plist = ... // ProxyBean들을 담고 있는 proxy list

 System.out.println("before size:"+ plist.size());

 List<ProxyBean> sliet = new ArrayList<ProxyBean>(new HashSet<ProxyBean>(plist));

 System.out.println("after size:"+ sliet.size());


ProxyBean.java

import lombok.EqualsAndHashCode;

import lombok.ToString;


@ToString

@EqualsAndHashCode

public class ProxyBean {


public static final String HTTP = "http";

public static final String HTTPS = "https";

private String ip = "";

private int port = 0;

private String type = HTTP;

public ProxyBean(String ip, int port) {

this.ip = ip;

this.port = port;

}

public ProxyBean(String ip, int port, String type) {

this.ip = ip;

this.port = port;

this.type = type;

}


public String getIp() {

return ip;

}


public void setIp(String ip) {

this.ip = ip;

}


public int getPort() {

return port;

}


public void setPort(int port) {

this.port = port;

}


public String getType() {

return type;

}


public void setType(String type) {

this.type = type;

}


}