Java에서 사용자 정의 객체를 정렬해야 할 때 TreeMap을 활용하면 키 값을 기준으로 자동 오름차순 정렬을 손쉽게 구현할 수 있습니다. 아래 예제에서는 '이름 나이' 형태로 구성된 문자열 데이터를 파싱하여 나이순으로 정렬하고, 같은 나이일 경우 이름순으로 정렬하는 과정을 단계별로 살펴봅니다.
예제 코드
import java.io.*;
import java.util.*;
public class Demo{
static void sort_objects(String my_data){
String[] my_vals = my_data.split(" ");
Map<Integer, ArrayList<String> > my_map = new TreeMap<>();
for (int i = 1; i < my_vals.length; i += 2){
int my_age = Integer.parseInt(my_vals[i]);
String name = my_vals[i - 1];
if (my_map.containsKey(my_age)){
ArrayList<String> my_list = my_map.get(my_age);
my_list.add(name);
Collections.sort(my_list);
my_map.remove(my_age);
my_map.put(my_age, my_list);
}
else{
ArrayList<String> my_list = new ArrayList<>();
my_list.add(name);
my_map.put(my_age, my_list);
}
}
for (Map.Entry<Integer, ArrayList<String> > entry : my_map.entrySet()){
ArrayList<String> al1 = entry.getValue();
for (int i = 0; i < al1.size(); i++)
System.out.print(al1.get(i) + " " + entry.getKey() + " ");
}
}
public static void main(String args[]){
String my_obj = "Joe 36 Hannah 24 Jill 13 Jack 1 Preet 8 Deep 45";
System.out.println("The objects after sorting are : ");
sort_objects(my_obj);
}
}출력 결과
The objects after sorting are : Jack 1 Preet 8 Jill 13 Hannah 24 Joe 36 Deep 45
코드 동작 원리
Demo 클래스에는 'sort_objects'라는 정적(static) 함수가 정의되어 있습니다. 이 함수는 입력받은 문자열을 공백 기준으로 분리한 뒤, 정수(나이)와 문자열 리스트를 매핑하는 TreeMap을 생성합니다.
TreeMap은 키를 자동으로 오름차순 정렬해 주기 때문에, 별도의 정렬 로직 없이도 나이순으로 데이터가 유지됩니다. 반복문은 두 칸씩 건너뛰며 값을 순회하여 홀수 번째 인덱스의 값은 Integer.parseInt()로 나이로 변환하고, 바로 앞 인덱스의 값은 이름으로 처리합니다.
같은 나이가 여러 개인 경우의 처리
만약 이미 존재하는 나이가 다시 나타나면, 해당 나이에 연결된 리스트에 새 이름을 추가한 후 Collections.sort()를 호출해 이름순으로 재정렬합니다. 그런 다음 기존 엔트리를 제거하고 갱신된 리스트를 다시 TreeMap에 삽입하여 정렬 상태를 유지합니다.
결과 출력 과정
모든 데이터가 저장되면 entrySet()을 통해 TreeMap의 각 항목을 순회하며, 이름과 나이를 한 쌍으로 콘솔에 차례대로 출력합니다. main 함수에서는 정렬 대상이 되는 문자열 객체를 생성한 뒤 'sort_objects' 함수를 호출하고, 정렬 완료 안내 메시지를 화면에 표시합니다.
이처럼 TreeMap과 ArrayList를 함께 사용하면 키 기준 정렬과 보조 기준(값) 정렬을 조합한 다단계 정렬 로직을 깔끔하게 구현할 수 있습니다.