2013-10-30 65 views
3

我有一個Item類,它有兩個屬性 - id和timestamp。有一個自定義的比較器類來根據時間戳對itemList進行排序。具有不同排序選項的Java自定義比較器

有一種使用比較類,這樣我可以排序時間戳或排序ID指定的方法嗎?

項目類:

public class Item { 

     private Integer id; 
     private Date timestamp; 

} 

比較:

public class ItemComparator implements Comparator<Item>{ 
    @Override 
    public int compare(Item mdi1, Item mdi2) { 

    return mdi1.getTimestamp().compareTo(mdi2.getTimestamp()); 

    } 

} 

排序代碼:

Collections.sort(itemList, new ItemComparator()); 

我可以使用相同的比較過於排序編號列表?

回答

3

經過一些修改,是的。

添加一個構造函數與枚舉參數定義使用哪個領域:

public class ItemComparator implements Comparator<Item>{ 
    public enum Field { 
     ID, TIMESTAMP; 
    } 

    private Field field; 

    public ItemComparator(Field field) { 
     this.field = field; 
    } 

然後在比較方法,switch場上選擇:

@Override 
public int compare(Item mdi1, Item mdi2) { 
    int comparison = 0; 
    switch(field) { 
    case TIMESTAMP: 
     comparison = mdi1.getTimestamp().compareTo(mdi2.getTimestamp()); 
    case ID: 
     comparison = mdi1.getID() - mdi2.getID(); 
    } 
    return comparison; 
} 
+0

謝謝,這工作。 – janenz00

+2

這是有效的,但可能最好讓你的枚舉直接使用'Comparator '並在不同的情況下使用不同的'Comparator',而不是在不同的情況下使用不同的'Comparator'工作。 –

2

我可以使用相同的比較過於排序編號列表?

那麼你可以有一個構造參數來說明你想排序的屬性 - 但是我個人會爲此創建一個不同的類。你可以有許多類實現Comparator<Item>只要你喜歡......

0

使用兩個獨立的比較器。選擇您想在排序呼叫中使用哪一個。

1

可以使用Bean Comparator。然後,您可以對班級中的任何財產進行分類。您只需指定要用來獲取屬性排序的方法名稱即可。例如:

BeanComparator byId = new BeanComparator(Item.class, "getId"); 
Collections.sort(items, byId); 

該比較可以在任何類使用。