2016-01-13 32 views
2

我們是否有一個java收集庫,它返回添加到集合的對象的最後修改/插入日期。上次修改時間的Java收集數據結構

例如

TimeBasedSet<Foo> foos = new TimeBasedSet<>(); 
foos.add(foo1); //executed at t1 
foos.add(foo2); //executed at t2 
foos.add(foo1); //executed at t3 

foos.lastModifiedDate(foo1); //returns t3 
foos.lastModifiedDate(foo2); //returns t2 
foos.insertedDate(foo1); //returns t1 
foos.insertedDate(foo2); //returns t2 
+3

從來沒有見過這樣的事情,但它不難實現你自己的,擴展現有的實現並覆蓋修改Set的方法 – Leo

回答

4

我不知道任何現有的實現。

要實現你自己的,只需創建一個實現設置接口的新類。

public class TimeBasedSet implements Set<E> { ... } 

您可以在類這樣的元素的值類型中創建一個嵌套類(非靜態):

private class Val { 
    public E element; //public out of laziness since its nested/private. 
    public Date creationDate; 
    public Date lastModifiedDate; 
} 

值元件可以存儲你從字面上試圖將值類型存儲(無論E在您的地圖界面實現中)以及時間元數據。

然後,當你重寫add/get時,你可以調用set add/get並在此之後存儲新時間。

之後,你只需要一些功能來查找時間。

1

已經提到,現有集合中沒有這樣的數據結構。

作爲一種替代解決方案,我可以給你一個簡單的包裝上HashMap

import java.util.Date; 
import java.util.HashMap; 
import java.util.Map; 

class TimeBasedSet<T> { 

    private static class StorageData { 

     StorageData(Date insertionDate, Date lastModificationDate) { 
      this.insertionDate = insertionDate; 
      this.lastModificationDate = lastModificationDate; 
     } 

     Date insertionDate; 
     Date lastModificationDate; 
    } 

    private Map<T, StorageData> storage = new HashMap<>(); 

    public void add(T key) { 
     Date date = new Date(); 

     StorageData storageData = new StorageData(storage.containsKey(key) ? storage.get(key).insertionDate : date, date); 

     storage.put(key, storageData); 
    } 

    public Date getInsertionTime(Object key) { 
     return storage.containsKey(key) ? storage.get(key).insertionDate : null; 
    } 

    public Date getLastModificationTime(Object key) { 
     return storage.containsKey(key) ? storage.get(key).lastModificationDate : null; 
    } 
} 

多數民衆贊成上面顯示是相當簡單的實現。我們將所有數據存儲在HashMap中,其中密鑰爲某些參數化類型T,值爲StorageData類,其中包含存儲密鑰的插入時間和上次修改時間。

add方法我們創建StorageData爲添加的密鑰。上次修改時間始終設置爲當前時間。插入時間也設置爲當前時間,但如果此密鑰已在Map中,我們會適當地處理插入時間。然後我們將新的鍵值對放入Map

還爲每種類型的日期添加了兩個getters're。

0

謝謝「John Humphreys-w00te」和「Edgar Rokyan」。

我分析了兩種方法,並結合您的建議來實現TimeBasedSet。

  1. TimeBasedSet應該實現Set,因爲我需要使用其他Set方法,例如containsAll,addAll等
  2. 將E包裝在另一個對象中Val使實現複雜化。例如containsAll方法需要展開Val。

實施細則,

  1. 維持內部設置internalSet和地圖storageDataMap。
  2. 將來自TimeBasedSet大小的調用,isEmpty,包含等方法給internalSet。
  3. 對於add,addAll,remove,removeAll,retainAll和clear方法更新storageDataMap,然後將調用委託給internalSet。