- 컬렉션을 정렬하는데 필요한 메서드를 정의한 인터페이스이다.
1. Comparable(java.lang)
- 기본 정렬 기준을 구현하는데 사용한다.
- 파라미터로 들어온 객체와 자신을 비교한다.
- Comparable을 구현한 클래스들은 오름차순으로 정렬이 가능하다는 것을 의미
- Comparable을 구현한 클래스들 : Wrapper클래스, String, Date, File등
- TreeSet과 TreeMap에 저장되는 객체(혹은 키)는 저장과 동시에 오름차순으로 정렬이 된다
- 이때 모든 객체가 정렬되는 것은 아니고 해당 객체가 Comparable을 구현하고 있어야 정렬이 가능하다.
- Integer, Double, String은 Comparable을 이미 구현하고 있기 때문에 우리가 그냥 사용해도 정렬이 되는 것이다.
1) 메서드
메서드 | 설명 |
int compareTo(T o) | 해당 객체와 전달된 객체의 순서를 비교함 - 전달된 객체와 같으면 0 리턴 - 전달된 객체가 더 크면 음수 리턴 - 전달된 객체가 더 작으면 양수 리턴 |
2) Comparable 사용하기
public class Person implements Comparable<Person>{
private String name;
private int age;
private String city;
public Person(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getCity() {
return city;
}
// @Override
// public int compareTo(Person o) {
// if(this.age == o.age) return 0;
// else if(this.age > o.age) return 1;
// else return -1;
// }
@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.util.TreeSet;
public class ComparableEx {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("김개똥", 27, "서울"));
set.add(new Person("김소똥", 25, "서울"));
set.add(new Person("이철수", 20, "대전"));
set.add(new Person("박영희", 38, "부산"));
for (Person person : set) {
System.out.printf("name : %s, age : %s, city : %s\n", person.getName(), person.getAge(), person.getCity());
}
}
}
- 위의 코드를 보면 compareTo를 age와 name으로 구현했을 때, 각각 출력할 때의 정렬이 다른 것을 볼 수 있다.
2. Comparator(java.util)
- 기본 정렬 기준 외 다른 정렬 기준으로 정렬하고자 할 때 사용한다.
1) 메서드
메서드 | 설명 |
int compare(T o1, T o2) | 전달된 두 객체의 순서를 비교함 - o1과 o2가 같으면 0 리 - o1이 o2보다 앞에 오게 하려면 음수 리턴 - o1이 o2보다 뒤에 오게 하려면 양수 리턴 |
boolean equals(Object obj) | 해당 comparator와 전달된 객체가 같은지 확인함 |
default Comparator<T> reversed() | 해당 comparator의 역순 comparator를 리턴함 |
2) Comparator 사용하기
import java.util.Comparator;
import java.util.TreeSet;
public class ComparatorEx {
public static void main(String[] args) {
// TreeSet<Person> set = new TreeSet<>(new PersonComparator());
TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
});
set.add(new Person("김개똥", 27, "서울"));
set.add(new Person("김소똥", 25, "서울"));
set.add(new Person("이철수", 20, "대전"));
set.add(new Person("박영희", 38, "부산"));
for (Person person : set) {
System.out.printf("name : %s, age : %s, city : %s\n", person.getName(), person.getAge(), person.getCity());
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////
public class Person{
private String name;
private int age;
private String city;
public Person(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getCity() {
return city;
}
}
//////////////////////////////////////////////////////////////////////////////////////////
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if(o1.getAge() == o2.getAge()) return 0;
else if(o1.getAge() > o2.getAge()) return 1;
else return -1;
}
}
- PersonCompartor와 같이 비교자를 따로 만들어서 TreeSet 생성자에 넣어서 사용해도 되고
- 생성자에서 직접 구현을 해서 사용해도 된다.
- 위의 코드에서는 PersonCompartor에서는 나이를 비교, 바로 구현해서 사용한 경우 이름을 비교하였다.
'Java' 카테고리의 다른 글
[Java] 제네릭(Generic) (0) | 2023.01.26 |
---|---|
[Java] 컬렉션 프레임 워크 - Arrays, Collections (0) | 2023.01.24 |
[Java] 컬렉션 프레임 워크 - Iterator (0) | 2023.01.19 |
[Java] 컬렉션 프레임 워크 - Map (0) | 2023.01.18 |
[Java] 정규표현식 (0) | 2023.01.18 |