💡전체 코드
더보기
public class SortEX {
public static void main(String[] args) {
int[] arr = new int[] { 2, 5, 1, 4, 3 };
// 기본자료형 오름차순 정렬
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// 기본자료형 내림차순 정렬
// Comparator.reverseOrder()안됨 (문자열은 됨)
// Arrays.sort(arr, Comparator.reverseOrder());
String[] names = { "최길동", "박길동", "홍길동", "김길동" };
Arrays.sort(names);
System.out.println("문자열 오름차순-----------------");
System.out.println(Arrays.toString(names));
System.out.println("문자열 내림차순-----------------");
Arrays.sort(names, Collections.reverseOrder());
System.out.println(Arrays.toString(names));
// 기본자료형을 내림차순으로 정렬하기 위해 int -> Integer로 변환
Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
System.out.println("정수 내림차순--------------------");
Arrays.sort(arr2, Collections.reverseOrder());
System.out.println(Arrays.toString(arr2));
// 정렬알고리즘 응용
// Map 배열을 정렬해서 출력
Map<String, Object> map = new HashMap<>();
map.put("name", "박길동");
map.put("score", 60);
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "김길동");
map2.put("score", 80);
Map<String, Object> map3 = new HashMap<>();
map3.put("name", "이길동");
map3.put("score", 100);
Map<String, Object> map4 = new HashMap<>();
map4.put("name", "최길동");
map4.put("score", 70);
List<Map> list = new ArrayList<>();
list.add(map);
list.add(map2);
list.add(map3);
list.add(map4);
Collections.sort(list, new Comparator<Map>() {
@Override
public int compare(Map o1, Map o2) {
// return (int)o2.get("score") - (int)o1.get("score"); // 내림차순
return (int) o1.get("score") - (int) o2.get("score"); // 오름차순
}
});
list.stream().forEach(m -> System.out.println(m));
}
}
🔽 기본 자료 배열 정렬 int[ ]
오름차순 : Arrays.sort()
int[] arr = new int[] { 2, 5, 1, 4, 3 };
Arrays.sort(arr); // 오름차순
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
내림차순
// 기본자료형 내림차순 정렬(x)
Comparator.reverseOrder();
Arrays.sort(arr, Comparator.reverseOrder());
Collections.reverseOrder()은 문자열 배열을 내림차순으로 정렬할 때 사용하는 메서드이며, Arrays.sort(arr)는 기본적으로 오름차순 정렬만 지원되므로 내림차순 정렬은 별도로 할 수 없습니다.
📍방법 : int -> Integer로 변환
// 기본자료형을 내림차순으로 정렬하기 위해 int -> Integer로 변환
Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
System.out.println("정수 내림차순--------------------");
Arrays.sort(arr2, Collections.reverseOrder());
System.out.println(Arrays.toString(arr2)); //[5, 4, 3, 2, 1]
- Arrays.stream(arr): 기본 자료형 배열 (int[])을 스트림으로 변환합니다.
- boxed(): int 배열을 객체형 Integer[]로 변환합니다. (Java의 기본 자료형은 Comparator와 함께 사용할 수 없기 때문에 객체형으로 변환해야 합니다.)
- Collections.reverseOrder(): Integer[] 배열을 내림차순으로 정렬합니다.
🔽 문자 배열 정렬 String[ ]
오름차순 & 내림차순 (Arrays.sort(), Collections.reverseOrder())
String[] names = { "최길동", "박길동", "홍길동", "김길동" };
// 오름차순 정렬
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [김길동, 박길동, 최길동, 홍길동]
// 내림차순 정렬
Arrays.sort(names, Collections.reverseOrder());
System.out.println(Arrays.toString(names)); // [홍길동, 최길동, 박길동, 김길동]
- Arrays.sort(names): 문자열 배열을 유니코드 순서에 따라 오름차순으로 정렬합니다.
- Collections.reverseOrder(): 문자열 배열을 내림차순으로 정렬할 때 사용하는 메서드입니다. Comparator.reverseOrder()는 Comparator 객체를 반환하며, 이를 통해 내림차순 정렬을 할 수 있습니다.
🔽 Map 객체 정렬
오름차순 & 내림차순
Map<String, Object> map = new HashMap<>();
map.put("name", "박길동");
map.put("score", 60);
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "김길동");
map2.put("score", 80);
Map<String, Object> map3 = new HashMap<>();
map3.put("name", "이길동");
map3.put("score", 100);
Map<String, Object> map4 = new HashMap<>();
map4.put("name", "최길동");
map4.put("score", 70);
List<Map> list = new ArrayList<>();
list.add(map);
list.add(map2);
list.add(map3);
list.add(map4);
- 여러 개의 Map 객체를 생성하고, 각 객체에 name과 score를 넣습니다.
- 이 Map 객체들을 리스트에 추가하여, 이후 이 리스트를 정렬합니다.
Collections.sort(list, new Comparator<Map>() {
@Override
public int compare(Map o1, Map o2) {
return (int) o1.get("score") - (int) o2.get("score"); // 오름차순
}
});
list.stream().forEach(m -> System.out.println(m)); //출력
- Collections.sort(list, new Comparator<Map>()): 리스트의 Map 객체들을 정렬합니다. Comparator를 사용하여 score를 기준으로 정렬합니다.
오름차순
return (int) o1.get("score") - (int) o2.get("score");
//{name=박길동, score=60}
//{name=최길동, score=70}
//{name=김길동, score=80}
//{name=이길동, score=100}
내림차순
return (int) o2.get("score") - (int) o1.get("score");
//{name=이길동, score=100}
//{name=김길동, score=80}
//{name=최길동, score=70}
//{name=박길동, score=60}
🔽 제네릭을 활용한 Comparator 개선
Collections.sort(list, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
return Integer.compare((int)o1.get("score"), (int)o2.get("score"));
}
});
- Comparator를 제네릭으로 사용하여 타입 안정성을 향상시킬 수 있습니다. Integer.compare() 메서드를 사용하여 두 Integer 객체를 비교합니다.
- Integer.compare()는 두 값이 동일할 때 0, 첫 번째 값이 크면 1, 두 번째 값이 크면 -1을 반환합니다. 이를 사용하여 비교할 수 있습니다.
🔍 요약
기본 타입 정렬 | Arrays.sort(int[]) | 기본 타입 배열(정수) 오름차순 정렬만 가능 |
문자열 정렬 | Arrays.sort(String[]) | 문자열 배열을 오름차순/내림차순 모두 정렬 가능 |
객체형 정렬 (내림차순 가능) | Integer[] + Comparator | 객체형 배열(Integer[])을 Comparator와 함께 사용하여 내림차순 정렬 가능 |
컬렉션 정렬 | Collections.sort(List<T>, Comparator) | 리스트 타입 데이터 정렬 가능, 비교 기준 커스터마이징 가능 |
커스텀 정렬 기준 지정 | Arrays.sort(Object[], Comparator) | 객체 배열에 대해 커스텀 정렬 기준을 지정할 수 있음 |
정렬 기준 커스터마이징 도구 | Comparator | 정렬 기준을 커스터마이즈할 수 있는 인터페이스 |
기본 타입을 객체형으로 변환 | boxed() | 기본 타입 배열을 객체형 배열로 변환 (예: int[] → Integer[]) |
🔗 Comparator.reverseOrder(), Collections.reverseOrder()
자바) Comparator.reverseOrder(), Collections.reverseOrder()
Comparator.reverseOrder()Comparator.reverseOrder()는 Comparator 인터페이스를 구현하는 객체에 대한 내림차순 정렬을 위한 메서드입니다.이 메서드는 Comparator 객체를 반환합니다. 반환된 Comparator는 주어진 자
hpehpeyy.tistory.com
'코딩테스트' 카테고리의 다른 글
정렬) 2차원 배열 정렬 (1) | 2025.04.15 |
---|