소팅할 때 쓰는 자바의 내장 함수들을 살펴보려고 한다.
알고리즘 문제를 풀다보면, 소팅하는 조건(오름차순, 내림차순, 커스텀, ...
)이나 자료형(array, ArrayList, ...
)에 따라 소팅하는 방법이 조금씩 달라서 쓸 때마다 헷갈린다..
코딩테스트에서 은근히 시간을 많이 잡아먹어서 이번 포스팅에서 확실히 알아두려 한다!
int[] int_arr = {1,3,5,2,4};
double[] doublet_arr = {1.1, 3.3, 5.5, 2.2, 4.4};
String[] stringArr = {"A","C","F","E","D"};
Arrays.sort(intArr);
Arrays.sort(doubletArr);
Arrays.sort(stringArr);
Integer[] integer_arr = {1,3,5,2,4}; // 오름차순 아닐땐 int[]로 안됨
String[] string_arr = {"A","C","B","E","D"};
Arrays.sort(integerArr, Collections.reverseOrder()); //내림차순
Arrays.sort(stringArr, Collections.reverseOrder());
ArrayList<Integer> arr = new ArrayList<>();
Collections.sort(arr); // 오름차순
Collections.sort(list, Collections.reverseOrder()); // 내림차순
int[][] arr = {{3, 4, 5}, {1, 2, 3}, {5, 6, 7}};
// 방법 1
Arrays.sort(arr, (a, b) -> Integer.compare(a[1], b[1])); // [1]을 기준으로 오름차순
Arrays.sort(arr, (a, b) -> Integer.compare(b[1], a[1])); // [1]을 기준으로 내림차순
// 방법 2
Arrays.sort(arr, (o1, o2) -> o1[2] - o2[2]); // [2]을 기준으로 오름차순
Arrays.sort(arr, (o1, o2) -> o2[2] - o1[2]); // [2]을 기준으로 내림차순
// 방법 3 : Comparator override
Arrays.sort(arr, new Comparator<int[]>() { // [0]을 기준으로 오름차순
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
Integer[] arr = Arrays.stream(numbers).boxed().toArray(Integer[] :: new); // int[] -> Integer[]
Arrays.sort(arr);
String[] nums = new String[arr.length];
for(int i=0; i<arr.length; i++){
nums[i] = arr[i].toString();
}
Arrays.sort(nums, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2);
// 내림차순 : return (o2+o1).compareTo(o1+o2);
// 오름차순 : return (o1+o2).compareTo(o1+o2);
}
});
이거는 특정 문제에 한정되었던 소팅 방법이긴 한데, 예를 들어 3
과 30
이 있으면 이 두 정수를 붙혀서 가장 큰 수를 만들어야 했다. 숫자로 소팅하게 되면 30, 3
이 되어서 303
이 되어버리는데, 문제의 조건으로는 330
이 나와야 했기 때문에 '문자열로 바꿔서' 303
과 330
을 비교하는 방식으로 소팅했다!
그리고 소팅이랑은 별 관계 없지만 맨날 헷갈리는거,
length
: 배열의 길이를 알고자 할때 사용된다.length()
: 문자열의 길이를 알고자 할때 사용된다.size()
: Collection~ 타입의 길이를 알고자 할때 사용된다. (ArrayList, List, ...)코딩테스트 보면서 삽질한 내 코드들