티스토리 뷰

3줄 요약

Comparable : 정렬 대상 클래스 코드 수정이 가능할 때 객체 내부에서 사용
Comparator : 정렬대상 클래스 코드 수정이 불가한 경우, 이미 정렬된 객체에 새로운 기준으로 정렬할 경우 객체 외부에서 사용
람다식 : Collections, Stream 내에서 정렬하고자 할 때 사용

 

 

1. Comparable <T>

  • 정렬 대상 클래스에서 Comprable <T>를 implements 받아 compareTo(T t)를 @Override 받아 구현함
  • compareTo(Member other)의 결과
    • 음수 : 현재 객체는 other 보다 앞에 위치 ==> (현재 객체, other)
    • 0 : 순서 변경 X
    • 양수 : 현재 객체보다 other 객체가 앞에 위치 ==> (other, 현재 객체)
  • 정렬 기준
    • return this.getScore() - other.getScore() : 오름차순
    • return other.getScore() - this.getScore() : 내림차순
//Comparable : 정렬 대상 클래스를 수정할 수 있을 경우 Comprable 사용
public class Member implements Comparable<Member> {
    private String name;
    private int score;
    private int age;

    public int getAge() {
        return age;
    }

    public String getName() {
        return this.name;
    }

    public int getScore() {
        return this.score;
    }

    public Member(String name, int score, int age) {
        this.name = name;
        this.score = score;
        this.age = age;
    }

    /**
     * this.getScore() - other.getScore() : 오름차순
     * other.getScore() - this.getScore() : 내림차순
     */
    @Override
    public int compareTo(Member other) {
        return this.getScore() - other.getScore();
    }

}

 

 

1-1. 정렬된 객체 출력

 public static void main(String[] args) {
        Member 사나 = new Member("사나", 100, 31);
        Member 쯔위 = new Member("쯔위", 80, 28);
        Member 나연 = new Member("나연", 80, 20);
        Member 미나 = new Member("미나", 50, 33);

        List<Member> memberList = new ArrayList<>();
        memberList.add(사나);
        memberList.add(쯔위);
        memberList.add(나연);
        memberList.add(미나);

        System.out.println("==== 정렬 전 ====");
        for (Member member : memberList) {
            System.out.println("member = " + member);
        }

        // 정렬
        Collections.sort(memberList);

        System.out.println();
        System.out.println("==== Comparable 정렬 후 ====");
        for (Member member : memberList) {
            System.out.println("member = " + member);
            
        }
}

 

1-2. 출력 결과

 


 

2. Comparator <T>

  • 객체 외부에서 Comparator <T> 인스턴스 생성 및 @Compare(T t) 함수 @Override
  • compare(Member a, Member b)의 결과
    • 음수 : 첫 번째 객체가 두 번째 객체보다 작음 ==> (Member a, Member b)
    • 0 : 순서 변경 X
    • 양수 : 첫번째 객체가 두 번째 객체보다 큼 ==> (Member b, Member a)
  • 정렬 기준
    • return a.getScore() - b.getScore() : 오름차순
    • return b.getScore() - a.getScore() : 내림차순
public static void main(String[] args) {
        Member 사나 = new Member("사나", 100, 31);
        Member 쯔위 = new Member("쯔위", 80, 28);
        Member 나연 = new Member("나연", 80, 20);
        Member 미나 = new Member("미나", 50, 33);

        List<Member> memberList = new ArrayList<>();
        memberList.add(사나);
        memberList.add(쯔위);
        memberList.add(나연);
        memberList.add(미나);

        System.out.println("==== 정렬 전 ====");
        for (Member member : memberList) {
            System.out.println("member = " + member);
        }
        
  	Comparator<Member> comparator = new Comparator<Member>() {
            /**
             * b.getAge() - a.getAge() : 내림차순
             * a.getAge() - b.getAge() : 오름차순
             */
            @Override
            public int compare(Member a, Member b) {
                return b.getAge() - a.getAge();
            }
        };

        System.out.println();
        System.out.println("==== Comparator 정렬 후 ====");
        
        // 정렬
        Collections.sort(memberList, comparator);
        
        // 출력
        for (Member member : memberList) {
            System.out.println("member = " + member);
        }
}

 

2-1. 출력 결과

 

 

 

3. 람다함수로 정렬

  • Stream, Collections 호출 시점에 람다함수를 이용해 정렬
  • Collections.sort(자료구조, 람다함수) 형태로 사용
  • (a, b) -> b.getAge() - a.getAge()의 결과
    • 음수 : 첫번째 객체가 두 번째 객체보다 작음 ==> (Member a, Member b)
    • 0 : 순서 변경 X
    • 양수 : 첫번째 객체가 두 번째 객체보다 큼 ==> (Member b, Member a)
  • 정렬 기준
    • return a.getScore() - b.getScore() : 오름차순
    • return b.getScore() - a.getScore() : 내림차순
public static void main(String[] args) {
        Member 사나 = new Member("사나", 100, 31);
        Member 쯔위 = new Member("쯔위", 80, 28);
        Member 나연 = new Member("나연", 80, 20);
        Member 미나 = new Member("미나", 50, 33);

        List<Member> memberList = new ArrayList<>();
        memberList.add(사나);
        memberList.add(쯔위);
        memberList.add(나연);
        memberList.add(미나);

        System.out.println("==== 정렬 전 ====");
        for (Member member : memberList) {
            System.out.println("member = " + member);
        }
		
        // 람다함수로 정렬
        Collections.sort(memberList, (a, b) -> a.getAge() - b.getAge());
        
        System.out.println();
        System.out.println("==== 람다로 나이 순 정렬 ====");
        for (Member member : memberList) {
            System.out.println("member = " + member);
        }


}

 

3-1. 출력 결과

 

 

이상 정리 끝~!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함