【发布时间】:2017-01-03 17:50:58
【问题描述】:
如何创建一个 List 或类似的 Collection 来表示另一个集合的子集,屏蔽(过滤掉)不需要的元素但不创建全新的集合结构?
然后可以通过启用/禁用单个元素的可见性来更快地修改第二个列表。这样做应该比不断重建第二个单独的集合结构更有效。
我想象某种bit-map 对原始集合的看法。
理想情况下,这将是线程安全的,并且在修改原始集合时会快速失败。
例如,由同一个主集合支持的两个掩码集合:
- 主集合可能是 [狗、鹦鹉、猫、狮子、狼、蜂鸟]。
- 蒙面集合可能被命名为
canine包含 [ dog , wolf ] 而没有引用其他元素。 - 另一个蒙面集合可能是名称
feline包含 [ cat , lion ]。
另一个例子:我们有一个包含许多LocalDate 对象的列表。用户出于某种目的选择其中一些日期,可能只选择工作日而不是周末。然后用户更改他们的选择,对某些日期进行手动例外。不是每次都为选定的元素构建一个新列表,而是一个掩码集合会跟踪哪些元素被选中,而其他元素则被忽略。
【问题讨论】:
-
如果您打算根据每个元素的特征进行过滤,请参阅stackoverflow.com/questions/8458663/…,原因有很多,为什么这种方法 性能不佳。如果您只想根据原始后备列表中的索引进行过滤,则应该明确说明。
-
您提供的信息无法给出有意义的答案。数据结构设计的练习总是相同。指定 1) 需要完成的确切操作(插入、删除、查询等)2) 它们的相对频率,3) 空间与时间的重要性以及任何其他权衡。只有这样,您才能考虑替代方案。不要像你一样开始对最佳解决方案抱有先入之见。通常,正如@MattMcHenry 所指出的那样,一个看起来应该很有效的棘手解决方案会被一个没有效率的简单解决方案严重击败。
-
你打算用过滤后的列表做什么?很有可能使用过滤后的流。
-
我可能错了,所以请不要怪我。访问时间将是相同的,因为您没有创建一个新结构,您将不得不过滤集合更有效的是在插入时对内容进行分类(可以是 HashMap,字符串掩码作为键,列表作为值,包含您的元素)然后访问会更快。但这取决于您正在处理的数据的性质是否可分离
-
您可能想问问自己是否在做premature optimization。如果更简单的设计表现可以接受,您就不需要使事情复杂化。
标签: java collections