2012-12-20 26 views
8

Có bất kỳ trình so sánh mã nguồn mở Java nào để so sánh các bean bằng nhiều trường để phân loại nhiều cột không? Mỗi cột có thể được sắp xếp bắt buộc hoặc giảm dần.Trình so sánh Java để phân loại nhiều cột?

Để phân loại cột đơn, có thể đạt được bằng cách sử dụng org.apache.commons.beanutils.BeanComparator cùng với org.springframework.util.comparator.InvertibleComparator.

Tôi biết rằng chức năng này khá tầm thường để viết, nhưng lợi ích từ việc phát minh lại bánh xe là gì, nếu nó đã được viết và kiểm tra?

Trả lời

6

Tôi đã viết thư này vài tháng trước.

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

Chỉ kế thừa từ lớp này và ghi đè phương pháp doCompare. Sau đó, đặt một bộ so sánh tiếp theo trong chuỗi với setNext(). Trước đó một bộ so sánh xuất hiện trong chuỗi này, nó càng quan trọng.

EDIT:

Cũng thấy những gì tôi tìm thấy: http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/ComparatorChain.html

Đây là một phần của commons apache thư viện bộ sưu tập mà bạn có thể tải về here

+1

tên của lớp học của bạn đã nhắc nhở tôi về org.apache.commons.collections.comparators.ComparatorChain :) –

+1

Vâng, đó là wh tôi tìm thấy chỉ vài phút trước. Có lẽ đã phải google nó đầu tiên, trước khi thực hiện nó :) – Simon

1

Gần đây tôi đã viết một Trình so sánh để sắp xếp nhiều trường trong một bản ghi Chuỗi được phân tách. Nó cho phép bạn xác định dấu phân cách, cấu trúc bản ghi và các quy tắc sắp xếp (một số trong đó là loại cụ thể).

Thông tin bắt buộc được gieo vào chính Trình so sánh, theo cách lập trình hoặc thông qua tệp XML.

XML được xác thực bởi tệp XSD được nhúng trong gói. Ví dụ, dưới đây là một phân định tab bố trí kỷ lục với bốn lĩnh vực (hai trong số đó là sắp xếp được):

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

Sau đó, bạn dùng chương trình này trong java như vậy:

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

Thư viện có thể được tìm thấy ở đây :

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