2016-06-27 19 views
2

我有一個對象調用project,我想它的場2對這個項目進行排序:扭轉了自定義的CompareTo方法的部分物品

首先:按日期(公曆凱靈); 第二:按名稱(字符串);

我想按日期形式的新老項目進行排序。我知道這樣做的唯一方法是扭轉收藏。不過,我想按照名稱(按字母順序)對相同日期的項目進行排序,其中反向也顛倒了這一部分。

有沒有辦法扭轉排序方法只是一部分,或任何其他方式得到這個排序第一的(反向)的日期,然後一個字符串(正常秩序A-Z)?

目前我重寫對象compareTo方法,像這樣:

@Override 
public int compareTo(Project project) { 
    int i = this.projectDate.compareTo(project.projectDate); 
    if(i != 0) return i; 

    return this.projectName.compareTo(project.projectName); 

} 
+0

所以,你需要根據日期按降序排序,如果日期相同,您需要在該子集上完成名稱排序? – aksappy

+0

我覺得很好。讓我們看看其他人的建議。 Apache Commons CompareToBuilder也可以工作。我曾經用過那個。 – Kartic

回答

1

Date#compareTo返回一個值< 0如果此日期是日期參數和值> 0,否則之前。

如果要反轉排序由新老,你可以返回負比較結果:

@Override 
public int compareTo(Project project) { 
    int i = this.projectDate.compareTo(project.projectDate); 
    if(i != 0) return -i; // reverse sort 

    return this.projectName.compareTo(project.projectName); 
} 
+0

這麼簡單和完美的作品,謝謝:D –

2

在Java 8中,Comparator接口有一個方法thenComparing。您可以使用此方法創建一個比較器,該比較器可通過多個字段進行比較。

如果你有一個比較,按字母順序和其他按日期來比較比較,你可以結合比較由字段進行排序,你想:

Comparator<Project> nameComparator = ... 
Comparator<Project> dateComparator = ... 

您可以使用反向比較,如果混合比較,需要。以下是一些示例:

Comparator<Project> nameAndDateComparator = nameComparator.thenComparing(dateComparator); 
Comparator<Project> nameAndReversedDateComparator = nameComparator.thenComparing(dateComparator.reversed()); 

然後,您可以按照通常的方式使用匹配您需要的比較器進行排序。

如果你沒有使用Java 8中,您可以創建一個實用工具類,您比較相結合:

public class CombinedComparator<T> implements Comparator<T> { 

    Comparator<T> firstComparator; 
    Comparator<T> secondComparator; 

    public CombinedComparator(Comparator<T> firstComparator, Comparator<T> secondComparator) { 
     this.firstComparator = firstComparator; 
     this.secondComparator = secondComparator; 
    } 

    @Override 
    public int compare(T o1, T o2) { 
     int result = firstComparator.compare(o1, o2); 
     return (result != 0) ? result : secondComparator.compare(o1, o2); 
    } 

} 

而且你可以創建多個字段比較器是這樣的:

Comparator<Project> nameAndDateComparator = new CombinedComparator<Project>(nameComparator, dateComparator); 

Comparator<Project> nameAndReversedDateComparator = new CombinedComparator<Project>(nameComparator, Collections.reverseOrder(dateComparator)); 
+0

接受的芒是我需要得到我想要的這次。但爲了更復雜的比較,我會記住這一點,謝謝 –