
로직 떠올리기에 더 시간을 들이기 위해서 정렬 코드를 외워보자.
원시형, 객체형, 사용자 정의 객체형으로 기준을 나누었다.
배열, 큐 등이 제일 먼저 정렬 대상으로 떠오른다.
int[] arr = new int[]{4,5,7,8,1};
Arrays.sort()를 사용하면 끝. 문자열 배열도 이렇게 정렬할 수 있다.Arrays.sort(arr);
PriorityQueue<Integer> pq = new PriorityQueue<>();
2차원 배열을 특정 기준에 따라 정렬하려면 Comparator를 사용해야 한다.
람다식을 사용한 간단한 표현과 직접 Comparator를 오버라이딩하는 방법이 있다.
a가 왼쪽이면 오름차순, b가 왼쪽이면 내림차순이다.
Arrays.sort(students, (a, b) -> {
if (a[1] == b[1]) {
return Integer.compare(a[0], b[0]); // 0번째 요소 기준 오름차순
}
return Integer.compare(b[1], a[1]); // 1번째 요소 기준 내림차순
});
Arrays.sort(students, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
if (a[1] == b[1]) {
return Integer.compare(a[0], b[0]); // 0번째 요소 기준 오름차순
}
return Integer.compare(b[1], a[1]); // 1번째 요소 기준 내림차순
}
});
사용자 정의 객체로 이루어진 배열이라면 a[0] 식으로 인덱스로 접근할 수 없다.
Arrays.sort(students, (s1, s2) -> {
if (s1.getName().equals(s2.getName())) { // 이름이 동일할 때
return Integer.compare(s1.getScore(), s2.getScore()); // 점수 오름차순
}
return s1.getName().compareTo(s2.getName()); // 이름 오름차순
});
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if (s1.getName().equals(s2.getName())) {
// 이름이 같을 경우 -> 점수 오름차순 정렬
return Integer.compare(s1.getScore(), s2.getScore());
}
// 이름 오름차순 정렬
return s1.getName().compareTo(s2.getName());
}
});
참조형 자료구조들은 아래처럼 Collections.reverseOrder()로 쉽게 해결가능하다.
혹은 순차 정렬에서 a와 b의 위치를 변경하면 된다.
Arrays.sort(arr, Collections.reverseOrder()); // 배열 내림차순 정렬
PriotiryQueue<>(Collections.reverseOrder()); // 선언 시 우선순위 큐 내림차순 정렬
Arrays.sort(arr, Collections.reverseOrder()) 로 해결할 수 없다.
while문과 index 변수로 내림차순 출력할 수 있다. int index = arr.length - 1;
while (index >= 0) {
System.out.print(arr[index] + " ");
index--;
}
int[] arr = {1, 5, 3, 4, 2};
// 1. 오름차순 정렬
Arrays.sort(arr);
// 2. 새로운 배열 선언 (역순으로 값을 할당할 배열)
int[] reversedArr = new int[arr.length];
// 3. 역순으로 할당하기 (Arrays.sort() 결과를 뒤집어서 저장)
for (int i = 0; i < arr.length; i++) {
reversedArr[i] = arr[arr.length - 1 - i]; // 가장 뒤부터 값을 가져옴
}
마찬가지로 순차 정렬에서 a와 b의 위치를 바꾸면 된다.