본문 바로가기

Study/개발일지

[백엔드온라인TIL] java 학습 7일차

자바 Custom object를 중복제거 하는 법에 대해서는 찾기가 어려워서 블로그를 작성한다.

일반적으로 string이나 int값은 list나 array에 넣어서 hashset에 넣었다가 list나 array로 바로 빼면 쉽게 중복 제거가 가능하다

 

 

자바객체가 들어있는 Arraylist나 linkedlist를 제거하는 방법 중 빠르고 간편한 방법 하나는 Hashset이다..!!

 

2가지만 알면 위의 과정을 쉽게 처리할 수 있다.

 

 

 

 

첫번째 과정은 hashset을 이용하는 것이다.

가정 : custom객체는 FileVO로 가정(FileVO는 파일ID, 파일명, 확장자, MD5, 사이즈 등 파일의 여러 속성을 가진 객체)

가정 : 아래에 쓰인 test1과 test2는 FileVO 커스텀 객체로 만들어 가상 데이터가 들어있다.(list에 커스텀 객체를 넣다고 보면 된다)

 

아래는  ArrayList로 받아서 hashset을 이용하여 중복제거를 하는 과정이다.

 

 

소스 코드 :

 

ArrayList<FileVO> List = new ArrayList<FileVO>();

List.add(test1);

List.add(test2);

HashSet<FileVO> listSet = new HashSet<FileVO>(list);

 

Arraylist<FileVO> processedList = new Arraylist<FileVO>( listSet);

 

 

두번째 과정은 FileVO객체 쪽에 아래와 같은 정의가 필요하다.

가정 : FileVO 중복제거를 할 때, fileID와 MD5값을 고유값으로 가짐

 

위와 같은 가정을 바탕으로 FileVO 클래스에 아래와 같은 메쏘드를 추가하면 사용자가 만든 커스텀 객체도 중복제거가 가능하다.

 

@Override
public int hashCode(){
return (this.fileId.hashCode() + this.MD5.hashCode());
}

@Override
public boolean equals(Object obj){
if(obj instanceof FileVO){
FileVO temp = (FileVO) obj;
if(this.fileId.equals(temp.fileId) && this.MD5.equals(temp.getMD5())){
return true;
}
}
return false;
}

 

 

다른방법 

 

별도의 클래스 생성 하여 중복 방지 

 

package util;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class DuplicationUtil
{
    /*
    * @param list 중복이 있는 list
    * @param key 중복여부를 판단하는 키값
    * @param <T> generic Type
    * @return list
    * */
    public <T> List<T> deduplication(ArrayList<T> list, Function<? super T,?> key){
        return list.stream().filter(deduplication(key)).collect(Collectors.toList());
    }

    public <T>Predicate<T> deduplication(Function<? super T,?> key){
        Set<Object> set = ConcurrentHashMap.newKeySet();
        return predicate ->set.add(key.apply(predicate));
    }
}

 

 

Main.java에서 사용 

ArrayList<OrderProduct> finalList = (ArrayList<OrderProduct>) duplicationCheck.deduplication(bucketList, OrderProduct::getName);
728x90