TIL

Array.sort new Comparator<T>

정유감 2023. 11. 13. 20:18
728x90
반응형

2023년 11월 13일 TIL

알고리즘을 풀다보니 자꾸 나오는 패턴이 있어 정리해둘 목적으로 작성한다.

Array.sort

일단 Array.sortquickSort 형태의 내장 함수이며 @Override되지 않은 일반 형태에서는

int[] , long[] , short[] , char[] , byte[] , float[] , double[]

타입을 오름차순 정렬할 수 있다.

    Array.sort(array);




return

sortvoid 타입의 메서드라 return 되는 정보가 없다.
이 때문에 정렬하고자 하는 배열을 정렬과 동시에 새로운 배열에 옮겨 담지 못한다.

    // 될것 같았지만 안되던 것.
    int[] newIntArray = Array.sort(oldIntArray);




내림차순 정렬

직접 손으로 짜지 않아도, sort 내장 함수를 @Override 하여 역 정렬이 가능하다.

    //내림차순 정렬
    Arrays.sort(numbers, new Comparator<Integer>() {
        @Override
        public int compare(Integer a, Integer b) {
            return b.compareTo(a);
        }
    });

혹은

    //람다식을 사용한 내림차순 정렬
    Arrays.sort(numbers, (a, b) -> b.compareTo(a));




Comparator

        Arrays.sort(t, new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                return 0;
            }
        });

Intelli J 에서는

    Arrays.sort(strings, new C...

까지만 작성을 한다면

@Override compare 형태를 자동완성 시켜준다.


compare

내부에서 o1o2 를 가지고 놀게 되는데,

o1이 o2보다 작다면 음수를 반환

o1과 o2가 같다면 0을 반환

o1이 o2보다 크다면 양수를 반환

o1o2 는 현재 정렬하고 있는 배열 내부에서 현재 비교하고 있는 두개의 요소다.

@Override
public int compare(Integer a, Integer b) {
    return a - b; // 오름차순 정렬
}

@Override
public int compare(Integer a, Integer b) {
    return b - a; // 내림차순 정렬
}

compare 는 그 요소 뿐 아니라 String의 n번째 글자를 비교하여 그 글자를 기준으로 한
정렬에도 활용이 가능하다.



compareTo

그 외에도 compareTo 같은 경우 두 String1 String2 를 비교하여 사전순으로 비교해준다.

Arrays.sort(strings, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {

        if (s1.charAt(n) != s2.charAt(n))
            return s1.charAt(n) - s2.charAt(n);

        return s1.compareTo(s2);
    }
});




괄호 위치

처음에 이 메서드를 이용하다가 점심을 나가서 먹을 뻔 했는데,

Arrays.sort(strings, new Comparator<String>() { //<-- 여기 괄호가 안맞는다.
    @Override
    public int compare(String s1, String s2) {

        if (s1.charAt(n) != s2.charAt(n))
            return s1.charAt(n) - s2.charAt(n);

        return s1.compareTo(s2);
    }
}); //<-- 그 괄호는 여기서 닫힌다.

애초에

Arrays.sort(strings, new Comparator<String>() { @Override public int compare(String s1, String s2) { if (s1.charAt(n) != s2.charAt(n)) return s1.charAt(n) - s2.charAt(n); return s1.compareTo(s2); } } );

였나보다. 괄호가 가장 끝에서 닫힌다. 나는 끝에서 닫힌다




Object

Object 배열을 정렬하려면 해당 객체가 Comparable 인터페이스를 구현하거나, 정렬 시 Comparator 를 이용해야한다.

Arrays.sort(users, new Comparator<User>() {
    @Override
    public int compare(User u1, User u2) {
        return u1.getName().compareTo(u2.getName());
    }
});

아직까지는 이 정도를 활용하고 있다.
추후에 필요하다면 추가할듯

728x90
반응형