JAVABean 정렬

7280 단어 apache.bean
자바 에서 정렬 방법 을 사용 해 야 한다 면 Comparable 인 터 페 이 스 를 실현 해 야 한 다 는 것 은 잘 알려 져 있다.
public interface java.lang.Comparable {
          public int compareTo(Object o);
}
Comparable 인 터 페 이 스 는 하나의 방법 만 있 기 때문에 매우 간단 하 다.하지만 여러 속성 에 따라 대상 을 정렬 해 야 한다 면,
그러면 compare To 를 실현 하 는 방법 은 매우 복잡 해 질 것 이다.
다음은 자카르타 Commons cookbook 에서 따 온 예 입 니 다.
package com.discursive.jccook.collections.compare; 


import java.util.*; 


import org.apache.commons.lang.StringUtils; 


import org.apache.commons.collections.comparators.ReverseComparator; 

  

public class BookComparator implements Comparator { 

   
public int compare(Object o1, Object o2) { 

        
   int comparison = -1; 

       
    if( o1 instanceof Book && o2 instanceof Book ) { 



            Book b1 = (Book) o1; 


            Book b2 = (Book) o2; 


             String b1Name = b1.getName( ); 


             String b2Name = b2.getName( ); 


             String b1Author = b1.getAuthor( ); 


             String b2Author = b2.getAuthor( ); 


            if( StringUtils.isNotEmpty( b1Name ) && 


               StringUtils.isNotEmpty( b2Name ) ) { 


                 comparison = b1Name.compareTo( b2Name ); 


            } 


            if( comparison == 0 && 


                StringUtils.isNotEmpty( b1Author ) && 


                StringUtils.isNotEmpty( b2Author ) ) { 


                comparison = b1Author.compareTo( b2Author ); 


            }   


        } 


        return comparison; 


    } 


}

이 사례 는 북 이 라 고 불 리 는 bean 을 정렬 하 는 것 으로 name 과 author 에 따라
두 속성 을 정렬 합 니 다.우리 가 사용 할 때 다음 과 같은 형식 과 유사 할 수 있다.
     Arrary.sort(books,BookComparator)또는 collections.sort
(books,BookComparator).그 중 두 개의 인 자 는 정렬 할 배열 이나 list 입 니 다.
쓰 는 Comparator.다음은 컴 파 터 를 어떻게 만 드 느 냐 하 는 것 이다.
본 고 는 comons 의 구성 요 소 를 어떻게 사용 하여 Comparator 의 구 조 를 완성 하 는 지 보 여 주 는 것 이다.
단일 bean 의 단일 속성 정렬
       지금 우리 가 bean 의 한 속성 만 정렬 하고 싶다 면.그러면 구조 만.
Bean Comparator 의 인 스 턴 스 를 내 면 됩 니 다.
형식 은 다음 과 같다.
private BeanComparator comparator = new BeanComparator("name");
       이렇게 해서 우 리 는'name'속성 에 따라 집합 중의 bean 을 배열 했다.
순차 적 비교 기.집합 중인 bean 이 name 이라는 속성 이 있 을 때 정렬 할 때
이 정렬 기 는 집합 중의 bean 의 순 서 를 조정 합 니 다.
    BeanComparator 는 BeanUtils API 의 한 종류 로 쉽게 뿌리 를 내 릴 수 있 습 니 다.
bean 의 속성 에 따라 Bean 류 를 정렬 합 니 다.
       설명 이 필요 한 것 은 이 비교 기 는 javabean 규범 에 부합 되 는 클래스 만 비교 할 뿐,만약 클래스 가
이 속성 이나 속성 이 없습니다.get 과 set 방법 이 없 으 면 비교 할 때 던 집 니 다.
ClassCastException 。
장식 비교 기
       위 에서 생 성 된 비교 기 는 기본 적 인 정렬 규칙 을 가지 고 있 습 니 다.예 를 들 어 자연 순서에 따라 배열 합 니 다.
문자열 의 값 이""일 때 앞쪽 에 배열 합 니 다.다음 에 나 는 어떻게 이런 묵인 을 바 꾸 는 지 설명 할 것 이다.
규칙
       이 임 무 를 완성 하기 위해 서 는 comons.collections.comparators 를 사용 해 야 합 니 다.
제 공 된 몇 가지 장식 류,ReverseComparator,NullComparator,
Fixed Order Comparator 나 Comparator Utils 라 는 실 용적 인 클래스 입 니 다.
    다음은 역순 배열 을 설명 하고 빈 값 배열 과 사용자 정의 순서 배열 을 허용 하 는 실현 방법 을 설명 한다.
    우리 가 비교 기 를 역순 으로 배열 하고 싶 을 때 다음 과 같은 형 을 사용 할 수 있다.
형식:
      comparator = new ReverseComparator(comparator);
       설명 이 필요 한 것 은 이 기능 의 실현 은 정렬 이 끝 난 후에 정렬 할 array 또는
list 에서 reverse()방법 을 호출 하면 됩 니 다.그러나 이런 방법 은 아래 에서 말 한 것 에 적합 하지 않다.
bean 의 다 중 필드 를 정렬 할 때 한 필드 에 만 역순 으로 정렬 합 니 다.
   비교 기 를 특정한 순서 로 배열 할 때 Fixed Order Comparator 를 사용 해 야 합 니 다.
이 종 류 는 한 그룹의 대상 을 이러한 사용자 정의 순서에 따라 정렬 하 는 특수 한 순 서 를 정의 하 는 데 사용 된다.
구체 적 인 사례 는 다음 과 같다.
String[] severityOrder = { "Critical", "Minor", "Enhancement" };
Comparator severityComparator = new FixedOrderComparator    (severityOrder);
Comparator comparator=new BeanComparator("title",severityComparator) ;
위의 프로그램 과 같이 bean 의 title 속성 을 배열 에 따라 지정 할 수 있 습 니 다.
의 순서 로 정렬!
마지막 으로 설명 할 것 은 위 에서 언급 한 몇 가지 장식 이 Comparator Utils 라 는 실 용적 인 유형 에서 도 지원 되 었 다 는 것 이다.
구체 적 인 사용 은 다음 과 같다.
bean 의 속성 이 null 일 때 정렬 합 니 다.속성 이 null 일 때 앞 에 있 는 지 뒤에 있 는 지 선택 할 수 있 습 니 다!
ComparatorUtils.nullLowComparator(comparator);  또는 Comparator Utils.nullHighComparator(comparator);
정렬 기 를 거꾸로 돌 릴 때:
ComparatorUtils.reversedComparator(mycmp); // 역순
 
여러 속성의 정렬
bean 의 여러 속성 을 정렬 하려 면 comons.collection.Comparator Chain 을 사용 해 야 합 니 다.이 클래스 는 Comparator 체인 을 정의 합 니 다.체인 의 Comparator 대상 은 순서대로 실 행 됩 니 다.이러한 종류의 addComparator()방법 을 통 해 하나의 comparator 대상 을 comparator 체인 에 추가 할 수 있 습 니 다.사용 할 때 하나의 comparator 를 사용 하 는 것 과 같 습 니 다.comparator Chain 도 comparator 의 핑 계 를 물 려 받 았 기 때문이다.하나의 comparator 를 추가 할 때 위 에서 언급 한 comparator 를 이용 하여 장식 할 수 있 습 니 다.
ComparatorChain comparatorChain = new ComparatorChain( );
comparatorChain.addComparator( new BeanComparator( "name" ) );
comparatorChain.addComparator( new BeanComparator( "author" ) );
comparaterChain.addComparator( new ReverseComparator                                                        (new BeanComparator("author") );
      구체 적 으로 사용 할 때 는 다음 과 같다.
    Arrays.sort( books, comparatorChain );
  이렇게 하면 이 comparator 를 sort()방법 에 전달 할 수 있 습 니 다.bean 의 다 중 필드 정렬 에 대해 이야기 하고 한 필드 에 만 역순 하 는 경우 다음 과 같은 실현 을 참고 할 수 있 습 니 다.
      ComparatorChain comparatorChain = new ComparatorChain( );
     comparatorChain.addComparator( new BeanComparator( "name" ) );
        이렇게 하면 bean 에 대한 name 을 정렬 하고 author 속성 을 역순 으로 배열 할 수 있 습 니 다.
그룹 bean 정렬
       하나의 bean 의 특정한 속성 이 다른 자바 bean 일 때,우 리 는 그 조합 되 어 들 어 온 bean 의 특정한 속성 에 따라 정렬 하고 싶 을 때,우 리 는 Bean Comparator 의 인 자 를 bean.property 형식 으로 간단하게 설정 해 야 한다.예 를 들 어 북 에 있 는 author 의 title 속성 에 따라 정렬 하려 면 다음 과 같은 형식 을 참고 할 수 있 습 니 다.
new BeanComparator
("author.title",severityComparator))
Comparable 인터페이스의 실현
       마지막 으로 author 류 에 대해 Comparable 인 터 페 이 스 를 실현 하려 면 다음 과 같은 실현 을 참고 할 수 있 습 니 다.
public class Book implements Comparable {
public int compareTo(Object arg0) {
// comparators setup
String[] severityOrder = { "Critical", "Major", "Minor", "Enhancement" };
//특수 한 순 서 를 정의 하고 한 그룹의 대상 을 이러한 사용자 정의 순서에 따라 정렬 합 니 다.
Comparator severityComparator = new FixedOrderComparator(severityOrder);
ComparatorChain compChain = new ComparatorChain();
       // 기본 자연 순 서 를 사용 하지 않 고 속성 에 존재 하 는 Comparator 를 지정 합 니 다.
compChain.addComparator(new BeanComparator("author.
title", severityComparator));
     compChain.addComparator(new NullComparator
(new BeanComparator("name"), true));
compChain .addComparator(new ReverseComparator
(new BeanComparator("id")));
     return compChain.compare(this, arg0);
    }
}
   또 다른 실현 방향 은 comons.lang.copareBulder 를 이용 하여 이 루어 지 는 것 이다.하지만 이상 의 장식 기능 을 잃 었 습 니 다!

좋은 웹페이지 즐겨찾기