객체 정렬에 필요한 매서드(정렬기준 제공)를 정의한 인터페이스
Comparable 기본 정렬기준을 구현하는데 사용
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자할때 사용
public interface Comparator{
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
public interface Comparable {
int compareTo(Object o); 주어진 객체(o)를 자신(this)과 비교
}
연습문제
class Ex11_7 {
public static void main(String[] args){
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); String의 Comparable구현에 의한 정렬
System.out.println("strArr=" + Arrays.toString(strArr));
// strArr = [Dog, cat, lion, tiger]
Arrays.sort(strArr, String.CASE_INSENSTIVE_ORDER); 대소문자 구분 안함
String 클래스에 있는 static 상수
System.out.println("strArr=" + Arrays.toString(strArr));
// strArr = [cat, Dog, lion, tiger]
Arrays.sort(strArr, new Descending()); 역순정렬(기본 정렬의 반대)
System.out.println("strArr=" + Arrays.toString(strArr));
// strArr = [tiger, lion, cat, Dog]
}
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을 곱해서 기본 정력방식의 역으로 변경한다.
//return c2.compareTo(c1)과 같다.
}
return -1;
}
}
}
정렬할때는 [대상], [기준]이 필요하다.
아래의 sort매서드에서는 Object[ ]가 대상이고, Comparator가 정렬 기준이 된다.
근데 static void sort(Object [] a)는 기준이 없다. 그래도 적용되는 이유는 해당 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬이 있기 때문이다.
static void sort(Object[] a); 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c); 지정한 Comparator에 의한 정렬
아래와 같이 String은 Comparable 인터페이스를 구현 받아 compareTo를 따로 정렬기준이 없어도 된다.
class String implements Comparable{
int compareTo(){} // 기본정렬기준(사전순 ABCabc)
}
Integer와 Comparable
(중요) String, Integer, Boolean, Float, Double, Character 등 비교가능한 타입들은 기본적으로 implement Comparable를 구현한다. 그래서 기본 정렬 기준을 제공한다. 기본정렬(default) 정렬기준이 없을때 사용
public final class Integer extends Number implements Comparable{
public int compareTo(object o){
return compareTo((Integer)o);
}
public int compareTo(Integer anotherInteger){
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return thisVal<anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
//return thisVal - anotherVal; 동일함
근데 연산(뺄셈)을 안하고 삼항연산자를 사용하는가... 성능이 약간 더 빠름
}
}
정렬: 두 대상 비교, 자리바꿈 반복(정렬 방법은 불변이나, 정렬 기준은 가변)
static void sort(int[] intArr){
반복문은 불변(자리바꿈 역할)!!!
for(int i=0;i<intArr.length-1;i++){
for(int j=0;j<intArr.length-1-i;j++){
int tmp = 0;
조건문은 가변(정렬기준)!!!
if(intArr[j] > intArr[j+1]){
tmp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = tmp;
}
}
}
}
static void sort(Object[] objArr, Comparator c){
for(int i=0;i<objArr.length-1;i++){
for(int j=0;j<objArr.length-1-i;j++){
Object tmp = null;
if(c.compare(objArr[j], objArr[j+1]>0){
tmp = objArr[j];
objArr[j] = objArr[j+1];
objArr[j+1] = tmp;
}
}
}
}
'java' 카테고리의 다른 글
collections framework - TreeSet (0) | 2023.09.02 |
---|---|
collections framework - HashSet (0) | 2023.09.02 |
collection framework : Arrays (0) | 2023.09.01 |
collection framework : Iterator, Enumeration, Map (0) | 2023.08.31 |
collection framework (0) | 2023.08.31 |
댓글