반응형

나는 VO(DTO)로 이루어진 ListList 각 객체의 특정 값으로 정렬해야 했다.

검색으로 알아낸 코드는 이렇다.


      
List<CodeVO> list = list.stream()
.sorted(Comparator.comparing(CodeVO::getCnt).reversed())
.collect(Collectors.toList());

java stream을 활용한 정렬 방법이다.

정렬하고자 하는 list를 stream()을 이용해 정렬sorted()하는데 정렬 조건이 (Comparator.comparing(CodeVO::getCnt).reversed())인 것이다.
CodeVO의 cnt값을 기준으로 내림차순 정렬하는 것이다.

오름차순 정렬을 원한다면 reversed()를 생략하면 되겠다.

 

여기 까지는 검색으로 빠르게 해결할 수 있었다.

 

하지만!

 

문제

문제는 cnt가 String으로 선언되어 있었다는 것이다.

그리하여 정렬이 문자열 기준으로 정렬이 되어버렸다.

 

예를 들어 cnt 값이 (1, 13, 2, 40, 5) 라면
문자열(String) 기준으로 (5, 40, 2, 13, 1) 이렇게 정렬되어 버리는 것이었다. 가장 앞자리 숫자만 보고 정렬해버리는 것이다!

숫자(int)라면 (40, 13, 4, 2, 1) 이렇게 되는게 맞았다.

 

그리하여 찾아낸 방법은 이렇다.

 

해결


      
List<CodeVO> list = list.stream()
.sorted(Comparator.comparingInt(item -> Integer.parseInt(((CodeVO)item).getCnt())).reversed())
.collect(Collectors.toList());

람다식을 사용해 형변환 해준 뒤 정렬했다.

내 검색실력 부족이었을까? 아무리 찾아도 원하는 답이 나오지 않아 챗쥐피티의 도움을 받았다.

이 코드는 chatGPT가 만들어 준 것이다. (물론 지피티도 한번에 답을 주지는 않았다.)

고마워요 chatGPT! 

 

어디선가 나처럼 삽질하고 있을 전우를 위해 기록을 남긴다.

반응형
그레이트현