【问题标题】:List masking elements from another List in Java列出来自Java中另一个列表的屏蔽元素
【发布时间】: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


【解决方案1】:

我会使用使用掩码位的过滤器类别。每种不同类型的元素都有不同的掩码位:

enum CategoryBits {
    CATEGORY_A = 0x0001;
    CATEGORY_B = 0x0002; 
    CATEGORY_C = 0x0004;
}

然后定义你想要包含哪些类别的掩码位:

enum MaskBits {
    filter1 = CATEGORY_A; //gets only CATEGORY_A items
    filter2 = CATEGORY_A | CATEGORY_B; //gets CATEGORY_A and CATEGORY_B items
}

所以你的收藏中的每个项目都会有一个功能:

CategoryBits categoryBits() const { return CATEGORY_A; } //return whatever category this item is

根据您要过滤的项目,您可以为容器设置 MASK_BITS。所以现在过滤你只需要做:

if(MASK_BITS & item.category() != 0) { //this item is in the categories you want }

速度非常快。

【讨论】:

  • 问题标记为 java。
  • @bradimus 抱歉没有看到标签。这个概念在java中是完全一样的。使用位掩码很快。
  • 答案是最基础的 OOP 概念失败了。您想强制对象实现功能,以便列表可以过滤它们。为什么这些对象甚至应该知道它们将在列表中或被过滤?如果您不拥有列表中对象的代码怎么办?
  • 假设我有一个List<String>。如何实施您的解决方案?
  • 如果您不拥有代码,您可以包装对象。是的,这是一个权衡。您会以更少的面向对象为代价获得更高效的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多