본문 바로가기
Dev/Java

[Java] 내가 자주 사용하는 List<T> 정렬 방법

by 석맨.class 2025. 2. 11.
반응형

목록 정렬하기

 // 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