devnoong.log
article thumbnail
728x90

일반적으로 정렬 알고리즘 (Arrays.sort() , Collections.sort() ) 은 'compareTo' 메서드의 반환값을 기준으로 정렬을 수행한다.


객체들간의 비교를 진행 하기 위해서는 Comparable 인터페이스를 구현하여  'compareTo' 메서드를 항상 오버라이딩(Override)하여 재정의 하여 사용한다.


구현되어 있지 않으면, 정렬  알고리즘을 사용 할 수가 없다.

 

compareTo 메서드 반환값

음수

compareTo메서드 반환값이 음수일 경우에는 현재 객체가 실제로 크던 작던 상관하지 않고, 비교 대상 객체보다 작은것으로 판단하여 현재 객체를 정렬시 앞쪽(=유지)에 위치하게 된다.

 

만약 현재 객체가 비교대상보다 작은 값이고  'compareTo' 메서드의 반환 값이 음수라면 현재값(=작은값)이 앞에 위치하게 되므로 오름차순 정렬이 될 것이다.

반대로 현재 객체가 비교대상보다 큰값이고 'compareTo' 메서드의 반환 값이 음수라면 현재값(=큰값)이 앞에 위치하게 되므로 내림차순 정렬이 될 것이다.

 

양수

compareTo메서드 반환값이 양수일 경우에는 현재 객체가 실제로 크던 작던 상관하지 않고, 비교 대상 객체보다 큰것으로 판단하여 정렬시 현재 객체를 뒤쪽(=교체)에 위치하게 된다.

 

만약 현재 객체가 비교대상보다 작은 값인데  'compareTo' 메서드의 반환 값이 양수라면 현재값(=작은값)이 뒤에 위치하게 되므로 내림차순 정렬이 될 것이다.

반대로 현재 객체가 비교대상보다 큰값이고 'compareTo' 메서드의 반환 값이 양수라면 현재값(=큰값)이 뒤에 위치하게 되므로 오름차순 정렬이 될 것이다.

 

 

compareTo 메서드 오버라이딩 구현

Comparable 인터페이스를 구현하여 test 객체를 생성하고, 정렬하는 메서들를 구현한다.

   public static class test implements Comparable<test>{
        int start;
        int end;

        public  test(int start,int end){
            this.start = start;
            this.end = end;
        }

        @Override
        public String toString(){
            return "test[ start = "+this.start+", end = "+this.end+" ]";

        }

        @Override
        public int compareTo(test other){
            return 1 ;
        }
    }

 

구현한 test객체에 여러값을 생성하여 정렬을 시도한다.

public static void main(String[] args) {
        ArrayList<test> testList = new ArrayList<>();
        testList.add(new test(1,3));
        testList.add(new test(11,13));
        testList.add(new test(16,53));
        testList.add(new test(10,33));
        testList.add(new test(12,323));
        
        Collections.sort(testList);
        testList.forEach(list -> {
            System.out.println(list.toString());
        });
    }

 

RETURN 음수 및 양수

기준값을 설정하지 않고 무조건 음수값을 반환하도록 하거나 양수값을 반환하도록 설정해봤다.

        @Override
        public int compareTo(test other){
            return -1 ;  or return 1;
        }

 

음수(왼쪽 사진) 및 양수(오른쪽 사진) 일 경우 아래와 같이 정렬된 결과값이 나타난다.

 

음수일경우에는 작은것으로 판단하여 뒤쪽에 위치하고, 양수일경우에는 큰것으로 판단하여 앞쪽에 위치하는게 일반적이지만 어떤 변수값을 기준으로 정렬한지 로직이 구현되어있지 않기때문에 무작위로 결과가 나타난다

(start의 값을 기준으로 정렬 한것도 아니고,  end 값을 기준으로만 정렬한 값도 아닌것으로 판단된다... 왔다갔다 하는듯)

 

기준값 설정

기준값 변수를 설정하여 오름차순, 내림차순을 정의 할수 있다.

오름차순 정렬

보통 this(현재 객체) - other(비교 객체) 를 진행하게 되면 오름차순 정렬로 정의 된다.

 

this객체가 큰값일경우에는 양수이므로, 교체(=뒤쪽)으로 위치하게 된다. 그럼 비교객체(작은값)이 앞쪽에 위치하게 된다.

this객체가 작은값일경우에는 음수이므로, 유지(=앞쪽)에 위치하게 된다. 그럼 비교객체(큰값)은 뒤쪽에 위치하게 된다.

 

이러한 형식으로 진행된다면 오름차순으로 정의된다.

 

아래의 코드는 start 변수를 기준값으로 설정 및  other.start - this.start를 통해 내림차순 정렬된 모습을 확인 할 수 있다.

        @Override
        public int compareTo(test other){
            if(this.start > other.start){
                System.out.println("thist.start  bigger, this = " + this.start + "  other = "+other.start);
            }else if(this.start < other.start){
                System.out.println("thist.start  smaller, this = " + this.start + "  other = "+other.start);
            }
           return this.start - other.start ;
        }

 

내림차순 정렬

보통 other(비교 객체) - this(현재 객체) 를 진행하게 되면 내림차순 정렬로 정의 된다.

 

this객체가 큰값일경우에는 음수이므로, 유지(=앞쪽)에 위치하게 된다. 그럼 비교객체(작은값)이 뒤쪽에 위치하게 된다.

this객체가 작은값일경우에는 양수이므로, 교체(=뒤쪽)에 위치하게 된다. 그럼 비교객체(큰값)은 앞쪽에 위치하게 된다.

 

이러한 형식으로 진행된다면 내림차순으로 정의된다.

 

아래의 코드는 start 변수를 기준값으로 설정 및  other.start - this.start를 통해 오름차순 정렬된 모습을 확인 할 수 있다.

        @Override
        public int compareTo(test other){
            if(this.start > other.start){
                System.out.println("thist.start  bigger, this = " + this.start + "  other = "+other.start);
            }else if(this.start < other.start){
                System.out.println("thist.start  smaller, this = " + this.start + "  other = "+other.start);
            }
           return other.start - this.start ;
        }

728x90