Comparable
collecion 클래스에서 구성 요소를 정렬하는 기준을 정의하는 인터페이스입니다.
Collection의 요소가 사용자 정의 클래스인 경우에는 Comparable 인터페이스를 상속받아 구현되어야 합니다.
상속 받은 뒤에는 정렬기준을 정의하는 compareTo 메소드를 구현해야 합니다.(오버라이드)
메소드 | 리턴 | 설명 |
compareTo(T o) | int | o와 객체가 가진 값이 같으면 0을 리턴 o보다 객체가 가진 값이 크면 양수를 리턴 o보다 객체가 가진 값이 작으면 음수를 리턴 |
public class Student implements Comparable<Student>{
int id ;
int score;
String name;
public Student(int id, int score, String name) {
this.id = id;
this.score = score;
this.name = name;
}
@Override
public int compareTo(Student o) {
return this.score - o.score;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", score=" + score +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
List<Student> students = new LinkedList<>();
students.add(new Student(1, 90, "AAA"));
students.add(new Student(2, 100, "BBB"));
students.add(new Student(3, 70, "CCC"));
students.add(new Student(4, 80, "DDD"));
System.out.println(students.toString());
Collections.sort(students);
System.out.println(students.toString());
}
// score 기준으로 정렬 전
[Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}, Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}]
// score 기준으로 정렬 후
[Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}, Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}]
Comparator
만약 사용자 정의 클래스에 compareTo가 정의되어 있지 않다면 Comparator 익명 객체를 선언하여 정렬 기준을 정의할 수 있습니다. 정렬하는 기능 메소드인 Collections.sort와 Arrays.sort를 호출하는 시점에 Comparator 객체를 선언하여 사용할 수 있습니다.
public class Student{
int id ;
int score;
String name;
public Student(int id, int score, String name) {
this.id = id;
this.score = score;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", score=" + score +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
List<Student> students = new LinkedList<>();
students.add(new Student(1, 90, "AAA"));
students.add(new Student(2, 100, "BBB"));
students.add(new Student(3, 70, "CCC"));
students.add(new Student(4, 80, "DDD"));
System.out.println(students.toString());
//comparator 정의
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.score - o2.score;
}
});
System.out.println(students.toString());
}
// score 기준으로 정렬 전
[Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}, Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}]
// score 기준으로 정렬 후
[Student{id=3, score=70, name='CCC'}, Student{id=4, score=80, name='DDD'}, Student{id=1, score=90, name='AAA'}, Student{id=2, score=100, name='BBB'}]
Comparator에 Lambda(람다식)를 사용하기
public static void main(String[] args) {
List<Student> students = new LinkedList<>();
students.add(new Student(1, 90, "AAA"));
students.add(new Student(2, 100, "BBB"));
students.add(new Student(3, 70, "CCC"));
students.add(new Student(4, 80, "DDD"));
System.out.println(students.toString());
// 람다식을 이용해 구현하기
Collections.sort(students, ((o1, o2) -> {return o1.score - o2.score;}));
System.out.println(students.toString());
}
'JAVA > JAVA' 카테고리의 다른 글
Optional (0) | 2021.11.07 |
---|---|
스트림 Stream (0) | 2021.11.07 |
Lambda Expressions 람다식 (0) | 2021.10.28 |
Collection 컬렉션 (0) | 2021.10.25 |
제어문(조건문 if, 반복문 for/while) (0) | 2021.10.07 |