-
20221014 TIL sort와 친해진 하루TIL 2022. 10. 14. 11:37
코딩테스트 문제를 풀다보면 정렬을 할 일이 많다.
꼭 자신을 정렬하는 경우 외에도 어떤 배열을 다른 배열에 따라 정렬해주고 싶은 경우가 있을 수 있다.
그래서 오늘 sort를 쓰는 문제를 푼 김에 sort를 어떻게 쓸 지에 대해 찾아보았다.
기본적으로 Arrays.sort()를 이용하면 오름차순으로 정렬이 된다.
그리고 아래와 같은 코드로 내림차순 정렬을 할 수 있다.
Arrays.sort(array, Collections.reverseOrder()); 혹은 Arrays.sort(array, (i, j) -> -1);
그리고 원하는 대로 array부분의 배열을 정렬해주고 싶은 경우,
Arrays.sort의 두 번째 인자(Comparator)를 조작해주면 된다.
예를 들어 Double값들이 들어간 array1 배열이 있을 때, array1 배열을 크기 순으로 오름차순 정렬해서
정렬하기 전의 index들이 들어간 배열을 구하고 싶다면
index를 오름차순으로 담은 array2 배열을 만들어두고,
Arrays.sort(array2, (i, j) -> Double.compare(array1[i], array1[j]));
위와 같은 코드를 이용해서 Double값들이 들어간 array1 값들을 정렬한 기준으로 array2의 값을 정렬할 수 있다.
Double.compare(a, b)는 a > b인 경우 양수 값을, a = b인 경우 0을 , b > a인 경우 음수 값을 반환한다.
만약 array2의 값들을 array1을 기준으로 내림차순으로 정렬하고 싶은데, 값이 같은 것들끼리는 오름차순으로 정렬하고 싶다면
Arrays.sort(array2, (i, j) -> Double.compare(array1[j], array1[i]));
위와 같은 코드를 이용할 수 있다.
만약 array2의 값들을 array1을 기준으로 내림차순으로 정렬하고 싶고, 값이 같은 것들끼리도 내림차순으로 정렬하고 싶다면
Arrays.sort(array2, (i, j) -> array1[j] > array1[i] ? 1 : -1);
위와 같은 코드를 이용할 수 있다.
왜냐하면 array1[j] = array2[i]인 경우 -1 이 반환되므로 내림차순으로 정렬된다.
만약 array2의 값들을 array1을 기준으로 오름차순으로 정렬하고 싶은데, 값이 같은 것들끼리도 오름차순으로 정렬하고 싶다면
Arrays.sort(array2, Comparator.comparingDouble(i -> array1[i]);
와 같이 나타낼 수 있다.
만약 array2의 값들을 array1을 기준으로 오름차순으로 정렬하고 싶은데, 값이 같은 것들끼리는 내림차순으로 정렬하고 싶다면
Arrays.sort(array2, (i, j) -> array1[i] > array1[j] ? 1 : -1);
와 같이 나타낼 수 있다.
+ 추가
Stream에서 boxed() 메소드를 이용하면 래퍼 클래스로 바뀐다.
기본 타입 래퍼 클래스 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 원하는 배열 자료형이 있는 경우 Stream에서 .toArray(원하는 배열 자료형::new)를 이용하자.
그리고 주의할 점!! 항상 0으로 나누는 경우에 대한 예외처리를 해주자.
0으로 나누게 되면 NaN이 나오기 때문에 주의해야 한다.
'TIL' 카테고리의 다른 글
20221015 TIL Node.js에서 패키지를 실행 방법 총정리 (0) 2022.10.17 20221017 TIL 핸드폰으로 코딩을 해보았다. (0) 2022.10.17 20221013 TIL 순서를 보장해주는 Collection과 그렇지 않은 Collection (0) 2022.10.13 20221012 TIL SpyBean VS. MockBean (0) 2022.10.12 20221011 TIL 막힐 때는 단계를 나누어 차근차근 (0) 2022.10.11