본문 바로가기
언어/Java

[Java] 컬랙션 프레임워크 커스텀 정렬

by Geunny 2020. 9. 18.
반응형

자바 Collection Framework 정렬하기

객체에 Comparable 인터페이스 상속받아 정렬

  • 사용자가 정의한 객체에서 Comparable<클래스명> 인터페이스를 상속받 compareTo 메서드를 구현함으로써 사용자가 정의하는 정렬 기준을 정할 수 있다.
  • 아래의 예시에서는 두개의 int 필드를 갖는 객체가 number1을 우선 기준으로 정렬한뒤 number2를 기준으로 정렬하는 형태로 정의하였다.
  • 사용할 객체​
class myObject implements Comparable<myObject> {
    String name;
    int number1;
    int number2;​

    public myObject(String name, int number1, int number2) {
        this.name = name;
        this.number1 = number1;
        this.number2 = number2;
    }​

    @Override
    public int compareTo(myObject o) {
    	if(this.number1 < o.number1){
            return -1;
        }
        if(this.number1 > o.number1){
            return 1;
        }
        if(this.number2 < o.number2){
            return -1;
        }
        if(this.number2 > o.number2){
            return 1;
        }
        return 0;
    }

    @Override
    public String toString() {
        return "[" + this.name + "," + this.number1 + "," + this.number2 + "]";
    }
}
    • 테스트
  public class Sort_Comparable {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new myObject("A", 2, 2));
        list.add(new myObject("A", 1, 1));
        list.add(new myObject("A", 2, 1));
        list.add(new myObject("A", 1, 2));
        System.out.println("before sorting:" + list);
        Collections.sort(list);
        System.out.println("after sorting:" + list);
    }
}
  
  • 출력

Comparator 인터페이스의 compare 메소드를 오버라이딩 하여 정렬

  • 위와 유사하지만 다른 인터페이스인 Comparator를 이용하여 커스텀 정렬이 가능하다.
  • Comparable 인터페이스의 경우 사용하는 객체에 상속함으로 사용했지만 Comparator 인터페이스는 정렬하는 객체와는 별개로 구현한다.
  • Comparator 인터페이스를 상속받는 객체를 정의해 주거나 이너클래스형태로 작성이 가능함.
  • 상속하여 객체 정의 할 경우
    • 객체에 Comparator 인터페이스를 직접 상속할 시에도 제네릭은 정렬할 객체로 지정해 주어야 사용이 가능하다!
  • 이너 클래스로 사용할 경우
    • 정렬할 클래스 정의
class myComparator implements Comparator<myObject2> {
    @Override
    public int compare(myObject2 o1, myObject2 o2) {
        if(o1.number1 < o2.number1){
            return -1;
        }
        if(o1.number1 > o2.number1){
            return 1;
        }
        if(o1.number2 < o2.number2){
            return -1;
        }
        if(o1.number2 > o2.number2){
            return 1;
        }
        return 0;
    }
}
  • 이너클래스로 정렬
    • 아래 코드와 같이 Collections.sort() 사용시 정렬할 컬랙션 객체와 정의된 Comparator 상속받은 객체 or 이너클래스를 파라미터로 넘겨준다.
    public class Sort_Comparator {
        public static void main(String[] args) {
            ArrayList<myObject2> list = new ArrayList<myObject2>();
    
            list.add(new myObject2("A", 2, 2));
            list.add(new myObject2("A", 1, 1));
            list.add(new myObject2("A", 2, 1));
            list.add(new myObject2("A", 1, 2));
    
            System.out.println("before sorting:" + list);
            // 아래 new Comparator 이너클래스 대신 위에 정의한 myComparator 객체를 생성하여 넣어도됨.
            // Collection.sort(list,new myComparator());
            Collections.sort(list, new Comparator<myObject2>() {
    
                @Override
                public int compare(myObject2 o1, myObject2 o2) {
                    if(o1.number1 < o2.number1){
                    	return -1;
                    }
                    if(o1.number1 > o2.number1){
                        return 1;
                    }
                    if(o1.number2 < o2.number2){
                        return -1;
                    }
                    if(o1.number2 > o2.number2){
                        return 1;
                    }
                    return 0;
                }
    
            });
    
            System.out.println("after sorting:" + list);
        }
    }
  • 출력

람다식 사용

 

위 소스를 아래와 같이 람다식으로 사용 가능함.

 

public class Sort_Comparator {
    public static void main(String[] args) {
        ArrayList<myObject2> list = new ArrayList<myObject2>();

        list.add(new myObject2("A", 2, 2));
        list.add(new myObject2("A", 1, 1));
        list.add(new myObject2("A", 2, 1));
        list.add(new myObject2("A", 1, 2));

        System.out.println("before sorting:" + list);
        // 아래 new Comparator 이너클래스 대신 위에 정의한 myComparator 객체를 생성하여 넣어도됨.
        // Collection.sort(list,new myComparator());
        Collections.sort(list, (o1,o2) -> {
            if(o1.number1 < o2.number1){
                return -1;
            }
            if(o1.number1 > o2.number1){
                return 1;
            }
            if(o1.number2 < o2.number2){
                return -1;
            }
            if(o1.number2 > o2.number2){
                return 1;
            }
            return 0;
        } );

        System.out.println("after sorting:" + list);
    }
}

댓글