8

是否有任何 Java 开源比较器用于按多个字段比较 bean 以进行多列排序?每列可以按升序或降序排序。

对于单列排序,可以通过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

JSorter 是 Java 中多列排序的另一个开源替代方案。http://sourceforge.net/projects/jsorter/

于 2013-06-14T05:22:31.980 回答
1

我最近编写了一个比较器来对分隔的字符串记录中的多个字段进行排序。它允许您定义分隔符、记录结构和排序规则(其中一些是特定于类型的)。

所需信息以编程方式或通过 XML 文件植入 Comparator 本身。

XML 由包内嵌的 XSD 文件验证。例如,下面是一个制表符分隔的记录布局,有四个字段(其中两个是可排序的):

<?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 回答