Java
[Java] 객체 정렬(feat. Comparable, Comparator, 람다)
GOMSHIKI
2024. 6. 23. 14:11
반응형
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. 출력 결과
이상 정리 끝~!
반응형