2011-04-11 35 views
0

我有一個Leave對象列表,Leave的屬性是leaveDate(java.util.Date),leaveTime(int),leaveType(String )。現在要檢查List是否有節點的屬性leaveDate與timeStamp匹配,timeStamp是另一個Date對象,我們可以遍歷該列表。有沒有其他方法可以做到這一點?我也有以下條件檢查器:檢查對象列表是否有與該對象的給定屬性相匹配的節點

if (Lambda.select(this.fullLeaves, Lambda.having(Lambda.on(Leave.class).getLeaveDate(), Matchers.equalTo(timeStamp))).size() == 0) { 
      //some code 
} 

它使用lambdaj。謝謝。

回答

1

爲了改進簡單的迭代和測試屬性的性能,您必須創建一個數據結構以充當列表中對象的二級索引,並將您的選擇謂詞轉換爲針對該對象的查詢指數。

選擇謂詞的本質將決定哪些索引數據結構是最好的。如果你只是測試屬性的平等,那麼一個HashMap就可以。如果你需要做時間戳比較(之前,之後),那麼需要一個TreeMap。

請注意,這裏有一個權衡。二級索引會爲您提供更快速的列表搜索,但成本會增加複雜性,而列表添加和刪除速度會變慢。所以,這樣的平均列表大小和使用模式將決定一個二級索引是否會提高整體性能。


如果要測試的特性是可變/可能會改變,而對象是在列表中,那麼你就需要每個登記的對象的屬性改變時更新輔助指標。正確實施會增加額外的成本和複雜性。

1

當在對象列表中搜索時,您無法比在O(n)時間內遍歷對象做得更好。

還有其他兩個選項,但他們需要您使用其他數據結構 - 無論是代替列表,或在除它:

  1. 使用假對象的數組,並保持整理按時間戳。這樣您可以搜索正確的離開時間(日誌(n))。你用更高的插入時間來支付這個費用 - 因爲你必須在正確的位置插入Leave,並根據需要擴展數組大小 - 用一個List可以在O(1)中添加一個Leave。

  2. 使用地圖,其中關鍵是時間戳。通過這種方式,您可以在O(1)時間內找到您正在尋找的離開。

選項二更容易實現。無論如何,選擇取決於你如何使用數據結構 - 插入 - 尋找比率是多少?如果你做了更多的插入,那麼最好留在列表中。如果你做了更多的尋找,然後去地圖。

這也取決於您的典型列表的大小。如果僅僅是數百個物體,那麼你不會感覺到任何不同。

最後,最好的選擇是在特定的使用模式下測試各種實現。

相關問題