2012-12-20 12 views
8

Czy istnieje jakiś kompilator Java o otwartym kodzie źródłowym do porównywania ziaren przez wiele pól dla sortowania wielokolumnowego? Każda kolumna może być posortowana asceding lub malejąco.Komparator Java do sortowania wielokolumnowego?

W przypadku sortowania pojedynczych kolumn można je uzyskać, używając org.apache.commons.beanutils.BeanComparator wraz z org.springframework.util.comparator.InvertibleComparator.

Mam świadomość, że ta funkcjonalność jest dość banalna do napisania, ale jaka jest korzyść z ponownego odkrywania koła, jeśli zostało już napisane i przetestowane?

Odpowiedz

6

Napisałem to kilka miesięcy temu.

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; 
    } 
} 

Wystarczy odziedziczyć po tej klasie i zastąpić metodę doCompare. Następnie ustaw następny komparator w łańcuchu na setNext(). Im wcześniej w tym łańcuchu pojawi się komparator, tym bardziej "ważne".

EDIT:

także zobaczyć, co znalazłem: http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/ComparatorChain.html

Jest częścią commons apache bibliotece zbierania, które można pobrać here

+1

Nazwa klasy przypomniały mi o org.apache.commons.collections.comparators.ComparatorChain :) –

+1

Tak, to wh znalazłem zaledwie kilka minut temu. Może musiał najpierw google, zanim go wdroży :) – Simon

1

Niedawno napisałem komparator do sortowania wielu pól w obrębie rozdzielonego rekordu ciągu. Umożliwia zdefiniowanie separatora, struktury rekordu i reguł sortowania (niektóre z nich są specyficzne dla danego typu).

Wymagane informacje są rozesłane do samego komparatora, programowo lub poprzez plik XML.

XML jest sprawdzany przez osadzony plik XSD pakietu. Na przykład, poniżej znajduje znakami tabulacji layout rekord z czterech pól (z których dwa są sortable):

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

by następnie użyć w Java tak:

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

Library można znaleźć tutaj :

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

Powiązane problemy