자바로 개발을 할 적에, 주로 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; } } |