JAVA

[Java] Collections Framework - Comparator & Comparable

SangRok Jung 2022. 7. 28. 10:47
반응형

Comparator & Comparable


객제 정렬에 필요한 method(정렬기준 제공)를 정의한 Interface.

compare()와 comparTo()는 두 객체의 비교결과를 반환하도록 작성.

 

 

Comparable 기본 정렬기준을 구현하는데 사용.
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용.

 

 

* 정렬 sort() - 두 대상을 비교한 후 자리를 바꾸는 로직을 반복한다.

 

 

 

 

▶ 구현

Arrays.sort로 String[]을 정렬하는 예제.

String class 내부에 Comparable이 구현되어 있다.

public class smple {
    public static void main(String[] args) {
        String[] strArr = {"cat", "Dog", "lion", "tiger"};

        Arrays.sort(strArr); // (strArr, 정렬기준)으로 해야하지만 String 자체의 Comparable 구현에 의한 정렬
        System.out.println("strArr = " + Arrays.toString(strArr));

        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); //대소문자 구분안함.
        System.out.println("strArr = " + Arrays.toString(strArr));

        Arrays.sort(strArr, new Descending()); //역순 정렬
        System.out.println("strArr = " + Arrays.toString(strArr));
    }
}

class Descending implements Comparator {
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Comparable && o2 instanceof Comparable) {
            Comparable c1 = (Comparable)o1;
            Comparable c2 = (Comparable)o2;

            return c1.compareTo(c2) * -1;   // -1을 곱해서 기본 정렬방식의 역으로 변경.
                                            // 또는 c2.compareTo() 와 같이 순서를 바꿔도된다.
        }
        return -1;
    }
}

 

 

 

 

 

Comparator<T> Interface


정렬기준을 바꾸고 싶은 경우 아래와 같이 처리한다.

 

public static void main(String[] args) {
    TreeSet<Person> pSet = new TreeSet<Person>(new PersonComparator());

    }
}


public class PersonComparator implements Comparator<Person> {

    public int compare(Person p1, Person p2){
        return p2.getName().length() - p1.getName().length();
    }
}

 

    public static void main(String[] args) {
        TreeSet<Person> pSet = new TreeSet<Person>(new PersonComparator());
    }
    
    public int compare(Person p1, Person p2){
        return p2.getName().length() - p1.getName().length();
    }

 

 

* return되는 값이 양수면 왼쪽, 음수면 오른쪽의 값이 큰것이다.

 

 

 

 

compareTo()


단순한 정렬이 아닌 사용자가 정의한 기준에 따라 정렬한다.

 

 

    public static void main(String[] args) {
        TreeSet<Person> pSet = new TreeSet<Person>();

        pSet.add(new Person("John", 11));
        pSet.add(new Person("Sam", 54));
        pSet.add(new Person("chan", 25));
        pSet.add(new Person("Koo", 15));

        Iterator<Person> iter = pSet.iterator();

        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
        
        
        
    @Override
    public int compareTo(Person other) {
    	//return this.age - other.age 오름차순
        //return other.age - this.age 내림차순
    
    
    	// 나이를 기준으로 정렬
        if(this.age > other.age){
            return 1;
        }
        else if(this.age < other.age){
            return -1;
        }
        else{ //같은 경우
            return 0;
        }
    }

 

 

 

 

 

 

반응형

'JAVA' 카테고리의 다른 글

[Java] WildCard  (0) 2022.08.01
[Java] Collections Framework 예제  (0) 2022.07.28
[Java] Collections Framework - Collections method  (0) 2022.07.26
[Java] Collections Framework - Map  (0) 2022.07.26
[Java] Collections Framework - Set  (0) 2022.07.26