Interface Comparable
class를 비교하거나 내가 원하는 조건으로 자료구조를 정렬할때 Comparable Interface를 사용해보자.
기본구조
인터페이스 Comparable의 기본 구조
class Test implements Comparable<Test> {
@Override
public int compareTo(Test arg0) {
// TODO Auto-generated method stub
return 0;
}
}
클래스가 Comparable을 상속받게 되면 compareTo 오버라이드 메소드를 가지게 된다. compareTo 메소드에서 정렬기준을 정하고 비교값을 반환하여 정렬시킨다.
예제
Person 클래스에서 정렬기준을 나이로 정하고, 오름차순으로 정렬하는 예제이다.
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<Person> arrayList = new ArrayList<Person>();
arrayList.add(new Person("홍길동", 15));
arrayList.add(new Person("김삿갓", 22));
arrayList.add(new Person("전우치", 37));
Collections.sort(arrayList);
for (Person person : arrayList)
System.out.println(person.getName() + "\t" + person.getAge());
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Person person) {
// TODO Auto-generated method stub
if (person.getAge() < this.age) {
return 1;
} else
return -1;
}
}
결과화면
홍길동 15
김삿갓 22
전우치 37
다음 예제는 나이를 기준으로 오름차순으로 정렬 후, 이름순서(사전순)으로 내림차순하는 예제이다.
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
ArrayList<Person> arrayList = new ArrayList<Person>();
arrayList.add(new Person("홍길동", 15));
arrayList.add(new Person("이순신", 15));
arrayList.add(new Person("앙기모", 15));
arrayList.add(new Person("김삿갓", 22));
arrayList.add(new Person("전우치", 37));
Collections.sort(arrayList);
for (Person person : arrayList)
System.out.println(person.getName() + "\t" + person.getAge());
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Person person) {
// TODO Auto-generated method stub
if (person.getAge() > this.age) {
return -2;
} else if (person.getAge() == this.age) {
if (person.getName().compareTo(this.name) < 0)
return -1;
else
return 0;
} else
return 1;
}
}
결과화면
홍길동 15
이순신 15
앙기모 15
김삿갓 22
전우치 37
Comment
굳이 Comparable을 이용한 정렬이 불필요하다면,
[배열]
- Arrays.sort(array)
- 내림차순 정렬 불가
[ArrayList]
- Collections.sort(arrayList)
- Collections.reverse(arrayList)
를 사용하여 간단하게 정렬할 수 있다.