반응형
목록 정렬하기
// List<String> 정렬 예제
List<String> fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("apple");
fruits.add("Cherry");
fruits.add("Date");
// 오름차순 정렬
fruits.sort(String::compareTo);
System.out.println("오름차순: " + fruits);
// 결과: [Banana, Cherry, Date, apple]
// 내림차순 정렬
fruits.sort(Comparator.reverseOrder());
System.out.println("내림차순: " + fruits);
// 결과: [apple, Date, Cherry, Banana]
// 대소문자 구분 없이 오름차순 정렬
fruits.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println("대소문자 구분 없이 오름차순: " + fruits);
// 결과: [apple, Banana, Cherry, Date]
// 대소문자 구분 없이 내림차순 정렬
fruits.sort(String.CASE_INSENSITIVE_ORDER.reversed());
System.out.println("대소문자 구분 없이 내림차순: " + fruits);
// 결과: [Date, Cherry, Banana, apple]
/**
class Obj {
private Integer num;
private String name;
...
}
*/
// List<Obj> 정렬 예제
List<Obj> objList = new ArrayList<>();
objList.add(new Obj(3, "나비"));
objList.add(new Obj(1, "김철수"));
objList.add(new Obj(2, "봉준호"));
objList.add(new Obj(1, "이영희"));
objList.add(new Obj(2, "박지성"));
// num 값으로 정렬
objList.sort(Comparator.comparing(Obj::getNum));
System.out.println("num 값으로 정렬:");
objList.forEach(System.out::println);
// 결과:
// { "num": 1, "name": "김철수" }
// { "num": 1, "name": "이영희" }
// { "num": 2, "name": "봉준호" }
// { "num": 2, "name": "박지성" }
// { "num": 3, "name": "나비" }
// num으로 정렬 후 name 값으로 정렬
objList.sort(
Comparator.comparing(Obj::getNum)
.thenComparing(Obj::getName)
);
System.out.println("\nnum으로 정렬 후 name 값으로 정렬:");
objList.forEach(System.out::println);
// 결과:
// { "num": 1, "name": "김철수" }
// { "num": 1, "name": "이영희" }
// { "num": 2, "name": "박지성" }
// { "num": 2, "name": "봉준호" }
// { "num": 3, "name": "나비" }
필드가 null 인경우 null 필드의 순서도 nullsFirst(), nullsLast() 로 지정 가능.
// List<Obj> 데이터 생성
List<Obj> objList = new ArrayList<>();
objList.add(new Obj(3, "나비"));
objList.add(new Obj(null, "홍길동"));
objList.add(new Obj(1, null));
objList.add(new Obj(2, "봉준호"));
objList.add(new Obj(null, null));
objList.add(new Obj(1, "김철수"));
objList.add(new Obj(2, null));
System.out.println("=== 원본 데이터 ===");
objList.forEach(System.out::println);
// 1. num 필드 기준으로 정렬 (null 값을 앞으로 정렬)
objList.sort(Comparator.comparing(Obj::getNum, Comparator.nullsFirst(Comparator.naturalOrder())));
System.out.println("\n=== num 기준 정렬 (null 값이 앞으로) ===");
objList.forEach(System.out::println);
// 결과:
// { "num": null, "name": "홍길동" }
// { "num": null, "name": null }
// { "num": 1, "name": "김철수" }
// { "num": 1, "name": null }
// { "num": 2, "name": "봉준호" }
// { "num": 2, "name": null }
// { "num": 3, "name": "나비" }
// 2. num 필드 기준으로 정렬 (null 값을 뒤로 정렬)
objList.sort(Comparator.comparing(Obj::getNum, Comparator.nullsLast(Comparator.naturalOrder())));
System.out.println("\n=== num 기준 정렬 (null 값이 뒤로) ===");
objList.forEach(System.out::println);
// 결과:
// { "num": 1, "name": "김철수" }
// { "num": 1, "name": null }
// { "num": 2, "name": "봉준호" }
// { "num": 2, "name": null }
// { "num": 3, "name": "나비" }
// { "num": null, "name": "홍길동" }
// { "num": null, "name": null }
서로 다른 클래스 목록 ( List<Object> ) 의 요소를 비교하기
List<Object> 객체 리스트에 클래스 A와 B 객체가 섞여 있다고 할때, 특정 필드로 정렬하기. ( A 클래스는 sno 필드, B 클래스는 no 필드 )
list.sort((o1, o2) -> {
// 1. 각 객체의 비교 키 추출
Integer key1 = (o1 instanceof A) ? ((A) o1).sno : ((B) o1).no;
Integer key2 = (o2 instanceof A) ? ((A) o2).sno : ((B) o2).no;
// 2. 안전한 정수 비교 (Integer.compare 사용)
return Integer.compare(key1, key2);
});
'Dev > Java' 카테고리의 다른 글
[java/spring/spring boot] Spring Framework 가 필요한 이유 (0) | 2024.02.28 |
---|