WEB/Back-end
Comparable, Comparator (Java)
by 최새벽
2024. 7. 18.
Comparable과 Comparator
- 객체가 Comparable 인터페이스를 구현하고 있어야 정렬 가능
- Integer, Double, String 타입은 구현 하고 있어서 사용 가능
- 사용자 정의 객체를 저장할 시에는 Comparable을 구현하고 있어야 사용 가능 함(오버라이딩)
compareTo
: 주어진 객체와 같으면 0, 작으면 음수, 크면 양수 return
- 비교 예시
public class SortEx {
public static void main(String[] args) {
// 기본자료형 정렬
int[] array = { 50, 10, 60, 30, 80, 40, 90 };
Arrays.sort(array); // 오름차순
// Arrays.sort(array, Collections.reverseOrder());// 기본자료형은 해당 방식 에러 발생
System.out.println(Arrays.toString(array));
// 참조자료형 배열
Integer[] array2 = new Integer[] { 50, 10, 60, 30, 80, 40, 90 };
// Arrays.sort(array2); // 오름차순
Arrays.sort(array2, Collections.reverseOrder());// 내림차순
System.out.println(Arrays.toString(array2));
// Person 대신 Map 사용 => List 객체에 Map 담기
// 나이순 정렬
List<Map<String, Object>> list = new ArrayList<>();
// K: 이름, V: 나이
Map<String, Object> person = new HashMap<>();
person.put("name", "홍길동");
person.put("age", 45);
list.add(person);
person = new HashMap<>();
person.put("name", "감자바");
person.put("age", 25);
list.add(person);
person = new HashMap<>();
person.put("name", "박지원");
person.put("age", 31);
list.add(person);
System.out.println(list);
// 정렬
// 기본 자료형의 래퍼 클래스가 제네릭 타입인 경우
List<Integer> list2 = new ArrayList<>();
list2.add(10);
list2.add(30);
Collections.sort(list2);
// list 안에
// 제네릭 타입이 Map<String, Integer>
Collections.sort(list, new Comparator<Map>(){
@Override
public int compare(Map o1, Map o2) {
// return (int) o1.get("age") - (int)o2.get("age"); // 오름차순
return (int) o2.get("age") - (int)o1.get("age"); // 내림차순
}
});
System.out.println(list);
System.out.println(list.get(2).get("name")); // 3번째로 나이가 많은 사람 출력
}
}