2013-01-23 40 views
0

我想達到以下目的,我有一個列表形式的日期集合,我想要進行重複和排序。我使用collections.sort按升序日期順序對列表進行排序,然後使用treeSet從列表中複製和重複刪除元素。這是一個2拍的方法?有一個更快,1步的方法嗎?排序和重複數據刪除java集合

EDIT:: 

Metadata 
{ 
String name; 
Date sourceDate; 
} 

基本上我想訂購基於sourceDate的元數據對象並重復它。

回答

3

您可以跳過Collections#sort步驟:TreeSet將刪除重複項並對條目進行排序。所以基本上它是一個行操作:

Set<Date> sortedWithoutDupes = new TreeSet<Date> (yourList); 

如果日期是在對象的字段,您可以:

  • 有你的目標實現可比性,根據他們的日期比較對象
  • ,或通過Comparator<YourObject>作爲參數傳遞給TreeSet的構造方法,按日期

在這兩種情況下,你的排序對象,你不需要預先整理喲你的名單。

重要提示:

TreeSet的使用compareTo鍵進行比較。因此,如果2個鍵的日期相同但名稱不同,則應確保compare或compareTo方法返回非0值,否則2個對象將被視爲相等,並且只會插入一個。

編輯

的代碼看起來是這樣的(未測試+你應該處理空值):

Comparator<Metadata> comparator = new Comparator<Metadata>() { 
    @Override 
    public int compare(Metadata o1, Metadata o2) { 
     if (o1.sourceDate.equals(o2.sourceDate)) { 
      return o1.name.compareTo(o2.name); 
     } else { 
      return o1.sourceDate.compareTo(o2.sourceDate); 
     } 
    } 
}; 

Set<Metadata> sortedWithoutDupes = new TreeSet<Metadata> (comparator); 
sortedWithoutDupes.addAll(yourList); 
+0

但是,如果日期是我的對象中的字段呢?那麼treeset可以按照日期的升序排列嗎? – Phoenix

+0

@Phoenix略有不同,但它仍然有效 - 請參閱我的編輯。 – assylias

0

TreeSet中會自動排序的元素,所以你應該不需要排序列表添加到集之前。

+0

但是treeset構造函數只允許一件事情,不管是重複數據刪除還是順序而不是兩種。我需要從現有列表中複製這些元素,因此我需要一步完成這項工作? – Phoenix

+0

集合總是重複數據刪除,它們不可能包含重複內容 - 至少這是界面的要求。他們會自動執行任何構造函數或任何添加操作。 –