8

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

単一列の並べ替えの場合は、とorg.apache.commons.beanutils.BeanComparator一緒に使用することで実現できますorg.springframework.util.comparator.InvertibleComparator

この機能を書くのは非常に簡単であることを私は知っていますが、それがすでに書かれてテストされている場合、車輪を再発明することの利点は何ですか?

4

3 に答える 3

7

私はこれを数ヶ月前に書きました。

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-Method をオーバーライドするだけです。次に、チェーン内の次のコンパレータを で設定しsetNext()ます。コンパレーターがこのチェーンに現れるのが早いほど、それはより「重要」です。

編集:

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

これは apache commons コレクション ライブラリの一部であり、ここからダウンロードできます。

于 2012-12-20T09:56:49.370 に答える
1

私は最近、区切り文字列レコード内の複数のフィールドをソートする Comparator を作成しました。区切り文字、レコード構造、および並べ替え規則 (型固有のものもあります) を定義できます。

必要な情報は、プログラムによって、または XML ファイルを介して Comparator 自体にシードされます。

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/

于 2014-01-03T15:00:19.213 に答える