이게 뭔데?
객체를 비교, 정렬하는 것이다.
Comparable과 Comparator의 차이점
Comparable은 자기 자신의 객체와 비교하는것
Comparator은 다른 객체와 비교하는 것이라는 차이점이 있다.
어떻게 쓰는 거?
import java.util.Arrays;
class Person implements Comparable<Person>{
int age;
public Person(int age){
this.age = age;
}
public int compareTo(Person o){
return this.age - o.age;
}
}
public class Main{
public static void main(String[] args){
Person[] arr = new Person[10];
for(int i =0; i < arr.length; i++){
arr[i] = new Person((int)(Math.random()*100));
}
Arrays.sort(arr);
for(Person s: arr) System.out.println(s.age);
}
}
객체끼리 비교할 때 기준을 정해 주는 것을 Comaprable이라고 한다
Comparable은 Interface이다 그렇기 때문에 꼭 객체에 compareTo()라는 함수를 Override 해줘야 한다.
//Interface Comparable
public interface Comparable<T> {
public int compareTo(T o);
}
Generic으로 type T를 받는데 객체를 받는 것이다.
제일 위의 예제 코드를 살펴보자
class Person implements Comparable<Person>{
int age;
public Person(int age){
this.age = age;
}
public int compareTo(Person o){
return this.age - o.age;
}
}
이 부분 처음 보면 어렵다.... 당황하지 말자 정훈아
implements로 Comparable <Person>을 상속받고 Generic type으로 Person 자기 자신을 넣어준다.
그 이유는 자기 자신과 비교하기 때문에
그럼 compareTo 에서 return은 뭘 반환하는 걸까?라는 질문을 할 수 있다.
아까 말했듯이 Comaparable은 객체 비교의 기준을 정해 주는 거다
여기서 나는 정렬 기준을 age의 크기로 잡은 것이다
return this.age - o.age
이 코드는 자기 자신의 객체와 배열에 저장한 다음 객체를 age의 크기로 비교한다
만약 [자기 자신 객체(this.age)] age = 3
[다음 객체(o.age)] age = 2
일 때 3 - 2를 한다면 양수가 나온다 양수가 나오면 서로의 값을 바꾸는 것이다
2-3이면 음수가 나오므로 바꾸지 않아도 된다.
사실 내가 설명하고 있는데 내가 이해한 대로 글로 쓰는 것이 어렵다........
Comparator
Comparator은 Comparable과 달리 자기 자신과 비교하지 않는다
import java.util.Arrays;
import java.util.Comparator;
class Person{
int age;
public Person(int age){
this.age = age;
}
}
public class Main{
public static void main(String[] args){
Person[] arr = new Person[10];
for(int i =0; i < arr.length; i++){
arr[i] = new Person((int)(Math.random()*100));
}
Arrays.sort(arr,test);
for(Person s : arr){
System.out.println(s.age);
}
}
public static Comparator<Person> test = new Comparator<Person>() {
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
};
};
}
익명 객체를 사용하여 정렬할 수 있다 Comparable과 비슷한 구조이다 하지만 파라미터를 두 개 즉
비교할 객체 두 개를 받는다.