순간을 성실히, 화려함보단 꾸준함을

[Java8] Arrays.sort 람다(lambda)를 사용해서 내림차순 해보기 본문

알고리즘,SQL/백준,BOJ

[Java8] Arrays.sort 람다(lambda)를 사용해서 내림차순 해보기

폭발토끼 2021. 12. 11. 23:39

요즘 lambdastream을 사용하는 것에 조금 집중하려고 하는데 이게 자바에서 함수형 프로그래밍을 쓰는게 되게 어렵네요....ㅠ

먼저 Arrays.sort()를 이용해서 정렬한 후에 stream()을 사용해서 출력까지 해보겠습니다.

     public static void solve() {
        int []arr = new int[4];
        //Integer []arr = new Integer[4];
        for(int i=0;i<4;i++)
            arr[i]= scan.nextInt();

        Arrays.sort(arr);
        //Arrays.sort(arr,(x,y)->y-x);
        Arrays.stream(arr).forEach(x-> System.out.print(x));
    }

딱히 어려운건 없습니다. 오름차순은 이런식으로 하면 됩니다.

그러나 문제는 내림차순을 하는 것인데, Comparator을 사용해서 내림차순을 할 수 있지만 전 lambda를 사용해서 내림차순을 진행보도록 하겠습니다.

그냥 단순하게 생각했을때는

    public static void solve() {
        int []arr = new int[4];
        //Integer []arr = new Integer[4];
        for(int i=0;i<4;i++)
            arr[i]= scan.nextInt();

        //Arrays.sort(arr);
        Arrays.sort(arr,(x,y)->y-x);
        Arrays.stream(arr).forEach(x-> System.out.print(x));
    }

이렇게 Arrays.sort(arr,(x,y)->y-x) 평범하게 알고 있는 람다식을 사용해주면 될 것 같습니다.
그러나 이는 에러가 발생합니다 ㅠㅠㅠ

이를 해결하기 위해선 int 인 primitive 자료형을 사용하는 것이 아니라 Integer 와 같은 primitive 자료형을 객체로 다루기 위해 사용하는 Wrapper class를 사용해 주면 됩니다.

    public static void solve() {
        //int []arr = new int[4];
        Integer []arr = new Integer[4];
        for(int i=0;i<4;i++)
            arr[i]= scan.nextInt();

        //Arrays.sort(arr);
        Arrays.sort(arr,(x,y)->y-x);
        Arrays.stream(arr).forEach(x-> System.out.print(x));
    }

bupjae 님의 말씀을 첨부하면

Arrays.sort(int[]) 에는 Comparator 를 입력받는 오버로드가 없기 때문에 Comparator 를 사용할 수 없습니다.   

Integer[] 를 사용할 때에는 Arrays.sort(T[], Comparator<? super T>) 를 호출할 수 있습니다.

라고 하십니다. 감사합니다.

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 23562 ] ㄷ 만들기  (0) 2021.12.13
[자바 입출력] System.out.println()을 쓰지 말자!  (0) 2021.12.12
[ boj : 23560 ] 약  (0) 2021.12.10
[ boj : 23559 ] 밥  (2) 2021.12.10
[ boj : 22254 ] 공정 컨설턴트 호석  (0) 2021.12.01