ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Array.sort 와 Collections.sort 의 차이
    Language/Java 2020. 1. 13. 18:36
    728x90
    반응형

    두개의 차이는 그냥 직관적으로도 정렬을 해주는 역할이고, Array.Sort는 배열을 정렬해주는 것이고 Collections.sort는 클래스의 객체를 정렬해주는 것이라고 생각이 든다. 파이썬에서는 sort가 있어서 너무 편했는데 자바는 없는 줄 알았지만 자바도 있었기 때문에 정리하려 한다.

     

     

    1. Array.sort (오름차순)

    Array.sort는 java.util.Arrays에 포함되어 있다. 따라서 import를 시켜서 사용을 해야한다. 사용법에 대해서 알아보자.

     

     

     

    위처럼 배열을 만들어서 java.util.Arrays를 import 시켜서 Arrays.sort(참조변수)를 하면 정렬이 된다.

    정렬이 되는 기준은 오름차순으로 숫자 > 대문자 > 소문자 > 한글순 으로 정렬이 된다. 

     

     

    1-1) 배열 복사

    파이썬에서도 copy() 라는 내장함수가 있는데 자바는 배열을 복사해주는 것이 없을까? 했지만 이것도 있다.

     

     

    위와 같이 메소드 arraycopy() 를 이용하면 된다. 인자의 순서는 다음과 같다.

     

    1. 복사할 원본의 배열
    2. 복사할 원본 배열의 시작 첨자 위치
    3. 복사될 목적 배열
    4. 복사될 배열의 시작 첨자 위치
    5. 복사할 원소의 수

    정렬과는 관계없지만 그냥 Arrays 에 관한 것이므로 알아두려한다.

     

     

     

    1-2) 내림차순 

     

     

     

    위와 같이 내림차순으로 정렬하면 어떻게 해야할까? 그래서 찾아 봤다. Array.sort(str,Collections.reverseOrder()); 라는 것을 찾았다. 파이썬에서 reverse의 내장함수와 같다. 오름차순과 반대로 한글순 > 소문자 > 대문자 > 숫자  정렬이 된다.

     

     

     

    2. Collections.sort 

    위의 코드와 같이, Collections를 import한 후에 sort() = 오름차순reverse() = 내림차순을 사용하면 된다

     

    오름차순

    한글순 > 소문자 > 대문자 > 숫자 

     

    내림차순

     숫자 > 대문자 > 소문자 > 한글순

     

     

    일반적으로 기준을 정하지 않고 그냥 Collections.sort(list)를 하면 오름차순으로 정렬이 된다. 

     

    하지만 다른 기준으로 정렬을 하고 싶다면 어떻게 해야할까?

     

     

    2-1) Comparable 인터페이스

    정수의 경우 크고 작음의 기준을 정할때 정수 자체의 값에 따라 판단을 하게 된다.

    하지만 새롭게 정의하는 클래스들을 보면,

    class Student {

        String name;

        int Score;

    }

     

    이렇게 정의되어있을때 두개의 Point 객체가 있을때 서로 비교를 한다고 할때 , 어느것이 작고, 어느것이 큰지

    비교를 할 수 없다. 그런데 비교를 해야 한다고 하면 어떤걸 기준으로 크고 작은지 판단을 해야한다. 

     

    이 기준을 잡아주는 것이 Comparable 인터페이스이고, 이 인터페이스를 구현한 클래스는 정렬을 하고자 할때 정렬이

     

    가능한 클래스가 된다.

     

     

    예제를 한번 보면서 이해해보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
     
    class Student implements Comparable{
        int score;
        String name;
     
        Student (int score, String name) {
            this.score = score;
            this.name = name;
        }
     
        public int compareTo(Object obj){
            Student s2 = (Student)obj;
     
            return s2.score - this.score;
        }
     
        public String toString(){
            return score + "," + name;
        }
    }
     
    public class ComparableTest {
        public static void main(String[] args) {
            List<Student> list = new ArrayList<>();
            list.add(new Student(20,"lee"));
            list.add(new Student(15,"choi"));
            list.add(new Student(9,"kim"));
            list.add(new Student(12,"park"));
     
            Collections.sort(list);
     
            for (Student s : list) {
                System.out.println(s.score);
            }
        }
    }
     
     
     

     

    원래 Collections.sort()는 기준을 재정의하지 않는다면 오름차순으로 정렬을 한다. 하지만 나는 내림차순으로 정렬을 원한다면 Comparable 인터페이스를 implements 해야한다. 그리고 Comparable 인터페이스의 추상메소드인 compareTo 메소드를 구현하여야 한다. a.compareTo(b) 가 있을 때

     

    • a > b : 양수를 반환
    • a == b : 0을 반환
    • a < b : 음수를 반환

     

    이렇게 반환을 하게된다. 따라서 위의 compareTo 메소드를 보면 this.score의 this 는 a의 score를 의미하고 인자의 s2.score는 b의 score 가 된다. 중요하니 잘 기억해둬야겠다. 

     

    하지만 CompareTo 메소드는 이미 정의 되어 있는 클래스를 상속받아서 다시 정의를 해야하는 비효율적인 면이 있다.

    만약 Compareble에 의해서 이름으로 정렬기준이 잡혀있다면 sort()메서드는 사전순으로 정렬을 하게 된다.

    ​그런데 이름으로 정렬의 기준을 잡아놓은 것을 나중에라도 사용할 수 있기 때문에 남겨놓고 새로운 정렬기준을 하나 더 쓰고 싶을 경우가 있고 계속 정렬기준을 바꿀 상황이 존재하는데 이럴 때마다 compareTo 메소드를 재정의하기는 번거롭다. 이럴 때 사용하는 것이 Comparator 인터페이스이다.  

     

     

     

    2-2) Comparator 인터페이스

    Collections.sort(list, comparator); 이런 형태의 정렬 방법이 존재한다. 앞에는 기존대로 컬렉션 객체가 들어가고, 뒤에 Comparator 객체가 들어가게 된다. 그러면 정렬시 list의 기준이 아니라 새롭게 매개변수값으로 받은 Comparator 객체를 기준으로 해서 정렬을 실행하게 된다. Comparable는 나의 compareTo() 메소드에 상대를 넣어서 비교를 했다면,

    Comparator는 비교대상 2개를 가지고 판단을 하게 된다. int compare(T o1, T o2); 이 메소드를 통해 두 객체의 특정 값을 연산해서 음수가 나오면 o1의 객체가 작다고 판단하며, 양수가 나오면 o2의 객체가 작다고 판단을 하게된다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
     
    class Student implements Comparable{
        int score;
        String name;
     
        Student (int score, String name) {
            this.score = score;
            this.name = name;
        }
     
        public int compareTo(Object obj){
            Student s2 = (Student)obj;
     
            return s2.score - this.score;
        }
     
        public String toString(){
            return score + "," + name;
        }
    }
     
    public class ComparableTest {
        public static void main(String[] args) {
            List<Student> list = new ArrayList<>();
            list.add(new Student(20,"lee"));
            list.add(new Student(15,"choi"));
            list.add(new Student(9,"kim"));
            list.add(new Student(12,"park"));
     
            Collections.sort(list, new Comparator<Student>() {
                @Override
                public int compare(Student s1, Student s2) {
                    if (s1.score < s2.score) {
                        return -1;
                    } else if (s1.score > s2.score) {
                        return 1;
                    }
                    return 0;
                }
            });
     
     
            for (Student s : list) {
                System.out.println(s.score);
            }
        }
    }
     
     

     

     

    Collections.sort를 Compartor을 이용해서 할 때는 어떻게 하는지 잘 기억해두자.

    반응형

    댓글

Designed by Tistory.