2012-12-20 18 views
8

マルチカラムソートのために複数のフィールドでBeanを比較するためのJavaオープンソースコンパレータはありますか?各列は、昇順または降順に並べ替えることができます。多列ソートのJavaコンパレータ?

シングルカラムソートの場合は、org.apache.commons.beanutils.BeanComparatororg.springframework.util.comparator.InvertibleComparatorを一緒に使用することで実現できます。

私は、この機能は非常に書きにくいことを認識していますが、ホイールが既に作成されてテストされていれば、ホイールの再発明のメリットはありますか?

答えて

6

私はこれを数ヶ月前に書いています。

public abstract class ChainedComparator<T> implements Comparator<T> { 

    private Comparator<T> next; 

    @Override 
    public int compare(T o1, T o2) { 
     int result = doCompare(o1, o2); 
     if (result == 0) { 
      if (getNext() != null) { 
       return getNext().compare(o1, o2); 
      } 
     } 

     return result; 
    } 

    public abstract int doCompare(T o1, T o2); 

    public Comparator<T> getNext() { 
     return next; 
    } 

    public void setNext(Comparator<T> next) { 
     this.next = next; 
    } 
} 

このクラスから継承し、doCompareメソッドをオーバーライドします。次に、チェーン内の次のコンパレータをsetNext()に設定します。以前の比較器がこの鎖に現れればするほど、それはより重要である。

EDIT:

また、私が見つけたものを参照してください。http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/ComparatorChain.html

これは、あなたがhere

+1

あなたのクラスの名前がorg.apache.commons.collections.comparators.ComparatorChainについて私に思い出させてきた:) –

+1

はい、それはWHです私はちょうど数分前に見つけました。多分それを実装する前に、まずそれをGoogleに持っていなければなりません:) – Simon

1

JSorterをダウンロードすることができますApacheのコモンズコレクションライブラリの一部では、マルチのための別のオープンソースの代替でありますJavaでの列ソート。 http://sourceforge.net/projects/jsorter/

1

私は最近、区切り文字列レコード内に複数のフィールドを並べ替えるコンパレータを書きました。区切り文字、レコード構造、ソートルール(一部は型固有のもの)を定義することができます。

必要な情報は、プログラムまたはXMLファイルを使用してコンパレータ自体にシードされます。

XMLは、パッケージに埋め込まれたXSDファイルによって検証されます。例えば、以下の4つの分野(そのうちの2つはソート可能です)と、タブ区切りのレコードレイアウトは次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <delimiter>&#009;</delimiter> 

    <column xsi:type="Decimal"> 
     <name>Column One</name> 
    </column> 

    <column xsi:type="Integer"> 
     <name>Column Two</name> 
    </column> 

    <column xsi:type="String"> 
     <name>Column Three</name> 
     <sortOrder>2</sortOrder> 
     <trim>true</trim> 
     <caseSensitive>false</caseSensitive>   
     <stripAccents>true</stripAccents> 
    </column> 

    <column xsi:type="DateTime"> 
     <name>Column Four</name> 
     <sortOrder>1</sortOrder> 
     <ascending>true</ascending> 
     <nullLowSortOrder>true</nullLowSortOrder> 
     <trim>true</trim> 
     <pattern>yyyy-MM-dd</pattern> 
    </column> 

</row> 

あなたはそのようにのようなJavaでこれを使用します。

Comparator<String> comparator = new RowComparator(
       new XMLStructureReader(new File("layout.xml"))); 

ライブラリはここで見つけることができます:

http://sourceforge.net/projects/multicolumnrowcomparator/

関連する問題