Java 检查对象列表是否具有与该对象的给定属性匹配的节点

Java 检查对象列表是否具有与该对象的给定属性匹配的节点,java,collections,Java,Collections,我有一个Leave对象的列表,Leave的属性是leaveDate(java.util.Date)、leaveTime(int)、leaveType(String)。现在,为了检查该列表是否有一个节点,其属性leaveDate与timeStamp匹配,timeStamp是另一个日期对象,我们可以遍历该列表。还有别的办法吗?我还有以下条件检查器: if (Lambda.select(this.fullLeaves, Lambda.having(Lambda.on(Leave.class).getL

我有一个Leave对象的列表,Leave的属性是leaveDate(java.util.Date)、leaveTime(int)、leaveType(String)。现在,为了检查该列表是否有一个节点,其属性leaveDate与timeStamp匹配,timeStamp是另一个日期对象,我们可以遍历该列表。还有别的办法吗?我还有以下条件检查器:

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

它使用。谢谢。

在搜索对象列表时,最好是在O(n)时间内迭代对象

还有两个其他选项,但它们要求您使用另一个数据结构,而不是列表,或者除列表之外:

  • 使用Leave对象数组,并按时间戳对其进行排序。这样,您可以在O(log(n))时间内搜索正确的休假。由于必须将Leave插入到正确的位置,并根据需要扩展数组大小,因此您可以使用一个列表在O(1)中添加一个Leave

  • 使用一个映射,其中键是时间戳。这样你就可以在0(1)分钟内找到你想要的假期

  • 方案二更易于实施。在任何情况下,选择取决于您如何使用数据结构-插入到查找的比率是多少?如果你做了更多的插入,那么最好还是留在列表中。如果你做了更多的搜索,那么去地图

    这还取决于你的典型列表有多大。如果只是几百个物体,你也不会觉得有什么不同


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

    要提高simple iterate的性能并测试属性,必须创建一个数据结构作为列表中对象的辅助索引,并将选择谓词转换为针对该索引的查询

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

    请注意,这里有一个权衡。二级索引将为您提供更快的列表搜索,但成本将增加复杂性,并降低列表添加和删除速度。因此,平均列表大小和使用模式等因素将决定二级索引是否能全面提高性能


    如果您正在测试的属性是可变的/在对象位于列表中时可能会更改,那么您需要在每次更改登记对象的属性时更新辅助索引。正确实现这一点将增加大量额外成本和复杂性