【问题标题】:Check whether a List of object has a node which matches a given property of that object检查对象列表是否具有与该对象的给定属性匹配的节点
【发布时间】:2011-04-11 10:22:28
【问题描述】:

我有一个 Leave 对象的 List,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。谢谢。

【问题讨论】:

    标签: java collections


    【解决方案1】:

    为了提高简单的迭代和测试属性的性能,您必须创建一个数据结构来充当列表中对象的二级索引,并将您的选择谓词转换为针对该索引的查询.

    选择谓词的性质将决定哪种索引数据结构最好。如果您只是要测试属性相等性,那么 HashMap 就可以了。如果您需要进行时间戳比较(之前、之后),则需要 TreeMap。

    请注意,这里有一个权衡。二级索引将为您提供更快的列表搜索,但成本会增加复杂性,以及更慢的列表添加和删除。因此,平均列表大小和使用模式等因素将决定二级索引是否能带来整体性能的提升。


    如果您正在测试的属性是可变的/当对象在列表中时可能会更改,那么您需要在每次更改登记对象的属性时更新二级索引。正确实施会增加大量额外成本和复杂性。

    【讨论】:

      【解决方案2】:

      在搜索对象列表时,最好的办法就是在 O(n) 时间内遍历对象。

      还有两个其他选项,但它们要求您使用另一种数据结构 - 代替 List 或补充它:

      1. 使用 Leave 对象数组,并保持按时间戳排序。这样您就可以在 O(log(n)) 时间内搜索到正确的离开。您为此付出了更长的插入时间 - 因为您必须在正确的位置插入 Leave,并根据需要扩展数组大小 - 使用 List 您只需在 O(1) 中附加 Leave。

      2. 使用 Map,其中键是时间戳。这样你就可以在 O(1) 时间内找到你要找的休假。

      选项二更容易实现。在任何情况下,选择取决于您如何使用数据结构——插入与查找的比率是多少?如果你做更多的插入,那么最好留在列表中。如果你做更多的寻找,那就去地图吧。

      这还取决于您的典型列表有多大。如果只是数百个对象,那么无论哪种方式,您都不会感到太大的不同。

      最后,最好的办法是在您的特定使用模式下测试各种实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多