Компаратор Java для сортировки по нескольким столбцам?

Есть ли компаратор Java с открытым исходным кодом для сравнения bean-компонентов по нескольким полям для сортировки по нескольким столбцам? Каждый столбец можно отсортировать по возрастанию или по убыванию.

Для сортировки по одному столбцу этого можно добиться, используя org.apache.commons.beanutils.BeanComparator вместе с org.springframework.util.comparator.InvertibleComparator.

Я понимаю, что этот функционал достаточно тривиален для написания, но какой смысл изобретать велосипед, если он уже написан и протестирован?


person Danubian Sailor    schedule 20.12.2012    source источник


Ответы (3)


Я написал это несколько месяцев назад.

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, которую вы можете скачать здесь

person Simon    schedule 20.12.2012
comment
Название вашего класса напомнило мне об org.apache.commons.collections.comparators.ComparatorChain :) - person Danubian Sailor; 20.12.2012
comment
Да, это то, что я нашел всего несколько минут назад. Возможно, сначала нужно было погуглить, прежде чем реализовать :) - person Simon; 20.12.2012

JSorter — еще одна альтернатива с открытым исходным кодом для сортировки по нескольким столбцам в Java. http://sourceforge.net/projects/jsorter/

person Rob Breidecker    schedule 14.06.2013

Недавно я написал Comparator для сортировки нескольких полей в записи String с разделителями. Это позволяет вам определить разделитель, структуру записи и правила сортировки (некоторые из которых зависят от типа).

Требуемая информация передается самому компаратору либо программно, либо через XML-файл.

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/

person Constantin    schedule 03.01.2014