JAVA 정책 모드
6879 단어 JAVA 프로 그래 밍
public static <T> void sort(T[] a, Comparator super T> c){
//...
}
주어진 정책 에 따라 배열 을 정렬 하 는 것 을 의미 합 니 다.sort 방법 은 해 야 할 일 입 니 다.T[]a 라 는 배열 은 전략 적 역할 의 대상 이 고 Comparator 전략 자체 입 니 다.그 중에서 Comparator 는 일반적인 인터페이스 로 전략 인 터 페 이 스 를 실현 한 모든 구체 적 인 전략 을 매개 변수 로 전달 할 수 있다.Comparator 는 어댑터 를 사용 하여 T 의 초 클래스 정책 을 이용 하여 T 를 조작 할 수 있 습 니 다.예 를 들 어 우 리 는 다음 과 같은 책 이 있다.
public class Book {
private double price;
public Book(double price){
this.price = price;
}
public double getPrice() {
return price;
}
}
우 리 는 sort 알고리즘 을 이용 하여 정렬 할 때 정렬 의 근거,즉 전략 을 스스로 선택 할 수 있 습 니 다.
public class StrategyTest {
@Test
public void test() {
Book[] books = new Book[]{new Book(10.00), new Book(8.70), new Book(12.35), new Book(35.50), new Book(12.35)
};
// 1:
Arrays.sort(books, new Comparator(){
@Override
public int compare(Book o1, Book o2) {
return Double.compare(o1.getPrice(), o2.getPrice());
}
});
System.out.println(" 1: ");
for(Book book : books){
System.out.print(book.getPrice() + "\t");
}
// 2:
Arrays.sort(books, new Comparator(){
@Override
public int compare(Book o1, Book o2) {
return Double.compare(o2.getPrice(), o1.getPrice());
}
});
System.out.println(" 2: ");
for(Book book : books){
System.out.print(book.getPrice() + "\t");
}
}
}
여기 서 익명 내부 클래스 를 사용 하여 전략 을 제공 합 니 다.실제 응용 에서 전략 도 정 해진 처리 방식 으로 사용자 에 게 선택 을 제공 합 니 다.예 를 들 어 String 클래스 에 서 는 대소 문자 가 민감 하지 않 은 정렬 정책 을 제공 합 니 다.
public static final Comparator CASE_INSENSITIVE_ORDER
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
public int compare(String s1, String s2) {
int n1 = s1.length();
int n2 = s2.length();
int min = Math.min(n1, n2);
for (int i = 0; i < min; i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (c1 != c2) {
c1 = Character.toUpperCase(c1);
c2 = Character.toUpperCase(c2);
if (c1 != c2) {
c1 = Character.toLowerCase(c1);
c2 = Character.toLowerCase(c2);
if (c1 != c2) {
// No overflow because of numeric promotion
return c1 - c2;
}
}
}
}
return n1 - n2;
}
/** Replaces the de-serialized object. */
private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
}
자바 집합 도구 류 Collections 도 비슷 한 sort 방법 을 제공 합 니 다.일반적으로 정렬 이 필요 한 클래스 도 Comparable 인 터 페 이 스 를 실현 함으로써 기본 적 인 자연 정렬 방법 을 제공 하지만 자연 정렬 이 수 요 를 만족 시 키 지 못 할 때 Comparator 정책 을 사용 해 야 한다.또한 Collections 는 역 자연 정렬 방법 을 제공 하 는 전략 도 제공 했다.Comparable 인 터 페 이 스 를 실현 한 클래스 에 대해 정렬 할 때 Collections 가 제공 하 는 역순 정렬 정책 을 사용 할 수 있 습 니 다.
// arrayOfComparable ( Comparable )
Arrays.sort(arrayOfComparable);
// arrayOfComparable
Arrays.sort(arrayOfComparable, Collections.reverseOrder());