반응형
Comparator & Comparable
객제 정렬에 필요한 method(정렬기준 제공)를 정의한 Interface.
compare()와 comparTo()는 두 객체의 비교결과를 반환하도록 작성.
Comparable | 기본 정렬기준을 구현하는데 사용. |
Comparator | 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용. |
* 정렬 sort() - 두 대상을 비교한 후 자리를 바꾸는 로직을 반복한다.
▶ 구현
Arrays.sort로 String[]을 정렬하는 예제.
String class 내부에 Comparable이 구현되어 있다.
public class smple {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); // (strArr, 정렬기준)으로 해야하지만 String 자체의 Comparable 구현에 의한 정렬
System.out.println("strArr = " + Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); //대소문자 구분안함.
System.out.println("strArr = " + Arrays.toString(strArr));
Arrays.sort(strArr, new Descending()); //역순 정렬
System.out.println("strArr = " + Arrays.toString(strArr));
}
}
class Descending implements Comparator {
public int compare(Object o1, Object o2) {
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2) * -1; // -1을 곱해서 기본 정렬방식의 역으로 변경.
// 또는 c2.compareTo() 와 같이 순서를 바꿔도된다.
}
return -1;
}
}
Comparator<T> Interface
정렬기준을 바꾸고 싶은 경우 아래와 같이 처리한다.
public static void main(String[] args) {
TreeSet<Person> pSet = new TreeSet<Person>(new PersonComparator());
}
}
public class PersonComparator implements Comparator<Person> {
public int compare(Person p1, Person p2){
return p2.getName().length() - p1.getName().length();
}
}
public static void main(String[] args) {
TreeSet<Person> pSet = new TreeSet<Person>(new PersonComparator());
}
public int compare(Person p1, Person p2){
return p2.getName().length() - p1.getName().length();
}
* return되는 값이 양수면 왼쪽, 음수면 오른쪽의 값이 큰것이다.
compareTo()
단순한 정렬이 아닌 사용자가 정의한 기준에 따라 정렬한다.
public static void main(String[] args) {
TreeSet<Person> pSet = new TreeSet<Person>();
pSet.add(new Person("John", 11));
pSet.add(new Person("Sam", 54));
pSet.add(new Person("chan", 25));
pSet.add(new Person("Koo", 15));
Iterator<Person> iter = pSet.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
@Override
public int compareTo(Person other) {
//return this.age - other.age 오름차순
//return other.age - this.age 내림차순
// 나이를 기준으로 정렬
if(this.age > other.age){
return 1;
}
else if(this.age < other.age){
return -1;
}
else{ //같은 경우
return 0;
}
}
반응형
'JAVA' 카테고리의 다른 글
[Java] WildCard (0) | 2022.08.01 |
---|---|
[Java] Collections Framework 예제 (0) | 2022.07.28 |
[Java] Collections Framework - Collections method (0) | 2022.07.26 |
[Java] Collections Framework - Map (0) | 2022.07.26 |
[Java] Collections Framework - Set (0) | 2022.07.26 |