티스토리 뷰
728x90
반응형
해당 내용은 실제 통계처리 과정에서 사용된 예시입니다.
요청 내용 : 특정 구분값을 기준으로 데이터를 그룹화 요청
해당 내용에서 우려됬던 부분이 그룹화 기준 값이다. 그룹하는 기준 값이 정적 데이터가 아닌 동적인 데이터다 보니
여러 값들이 나올 수 있는 상황이었다.
그래서 우선 대표되는 기준 값에 대하여 중복을 제거하여 리스트를 우선 생성하고 그 기준으로 데이터 그룹화를 진행하려고 했다. 하지만 객체를 대상으로 리스트를 중복제거하여 나타내기에는 어려움이 있었다.
아래는 흔히 우리가 아는 list stream 중복 제거 처리 방법 이다.
stream.distinct() 를 이용
//일반 배열을 통해 중복 제거
List<String> list = new ArrayList<>(Arrays.asList('a','b','c','d','c','d'));
List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
결과 : a,b,c,d
//클래스인 경우
public class Test{
private String title;
private String name;
...
}
List<Test> list = new ArrayList<>(Arrays.asList(
new Test('a','aa'),
new Test('b','bb'),
new Test('b','bb'),
new Test('c','cc'),
new Test('c','cc')
))
결과 :
title=a ,name=aa
title=b ,name=bb
title=c ,name=cc
위의 방식의 한계는 어떻게 될까?
일반적인 변수에 대한 처리를 할때는 위와 같이 하면 좋겠지만 클래스인 경우 해당 인스턴스의 값들이 모두 동일할 때 중복제거가 발생한다.
그러므로 사용자 정의에 특정 key값을 기준으로 처리하기에는 다소 사용이 어려운 부분이다.
물론 여러 방법중에 우회해서 즉 해당 구분값들만 새로 조회하여 처리하는 쿼리 메소드를 만들고 처리해서 중복제거를 하는 것도 가능하다. 하지만 나는 너무 우회해서 코드를 작업하는 거라 시간상 그리고 효율상 너무 불필요하다고 느꼈다.
그리하여 생각한 방법이 아래와 같은 방식이다.
처리 방법 : distinctByKey 메소드
/** 특정 KEY값 중복 체크 */
public static <T> Predicate<T> distinctByKey( Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
//========================================== 사용 방법 예시 ==========================================
Map 을 가지는 리스트일 경우
//목록 조회
List<Map<String,String>> resultList = bizChargePreMapper.selectChargeRetentionYearTypeTotalList(searchVO);
//Map 안에 'gubun' 값 기준 중복제거 리스트
//distinct를 이용하는 것이 아닌 filter를 이용하여 distinctByKey라는 메소드를 통해 특정 구분값을 기준으로 중복정보를 제거한다.
//filter를 이용하는 이유는 해당 값의 ture false를 이용하여 구분해내기 위함이다.
List<Map<String,String>> overlapList = resultList.stream().filter(distinctByKey(m->m.get("gubun"))).collect(Collectors.toList());
//gubun 값 기준 list 그룹화 진행
Map<String,List<Map<String,String>>> groupMap = resultList.stream().collect(Collectors.groupingBy(p->p.get("gubun")));
끝으로...
해당 작업을 하면서 이 방법 말고도 여러가지 처리 할 수 있는 법이 있었다. 하지만 굳이 이 방법을 한 이유는 새로운 시도를 하고 싶었다. 매번 같은 코드로 처리하는 것이 아닌 더욱더 간편한 처리 또는 더욱더 효율적인 알고리즘 방식을 새롭게 알아가는 것도 나쁘지 않기도 하고 또한 언젠가는 이 방식이 도움이 되는 날이 있지 않을까? 하는 생각이 들었기 때문이다..
728x90
반응형
'프로그램 언어 > JAVA' 카테고리의 다른 글
JSP/SERVLET ServletFileUPload 이용한 HttpServletRequest 데이터 처리 방법(파일 포함) (0) | 2023.05.16 |
---|---|
자바(java)에서 제공하는 lock 기능 (0) | 2023.05.03 |
자바(java) stream Map 그룹만들기 ,내림차순 정렬 , 더하기 (0) | 2023.05.02 |
자바(java) 얕은 복사와 깊은 복사의 차이(경험담..) (0) | 2023.05.02 |
java xml 정보 Sax 방식을 이용한 파싱 방법 (0) | 2023.05.02 |
250x250
반응형
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이미지
- 알고리즘
- 개념 이해하기
- 권한
- 캐시
- dockerfile
- 캘린더
- Java
- leatcode
- 컨테이너
- insert
- 스케줄러
- Quartz
- hazelcast
- 도커
- centos7
- 격리수준
- LocalDate
- ncp
- Lock
- mybatis
- 리눅스
- Cache
- spring
- MySQL
- docker
- Linux
- 네이버 클라우드
- dfs
- 정의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함