在Java中列出另一个列表中的屏蔽元素

在Java中列出另一个列表中的屏蔽元素,java,collections,Java,Collections,如何创建表示另一个集合子集的或类似的集合,屏蔽过滤掉不需要的元素,但不创建全新的集合结构 通过启用/禁用单个元素的可见性,可以更快地修改第二个列表。这样做应该比不断重建第二个单独的集合结构更有效 我想象着对原始收藏的某种看法 理想情况下,这将是线程安全的,并且如果修改原始集合,将快速失败 例如,由同一主集合支持的两个屏蔽集合: 最主要的收藏品可能是[狗、鹦鹉、猫、狮子、狼、蜂鸟]。 一个蒙面的集合可能被命名为canine,其中包含[dog,wolf],不引用其他元素。 另一个蒙面收藏可能是猫科动

如何创建表示另一个集合子集的或类似的集合,屏蔽过滤掉不需要的元素,但不创建全新的集合结构

通过启用/禁用单个元素的可见性,可以更快地修改第二个列表。这样做应该比不断重建第二个单独的集合结构更有效

我想象着对原始收藏的某种看法

理想情况下,这将是线程安全的,并且如果修改原始集合,将快速失败

例如,由同一主集合支持的两个屏蔽集合:

最主要的收藏品可能是[狗、鹦鹉、猫、狮子、狼、蜂鸟]。 一个蒙面的集合可能被命名为canine,其中包含[dog,wolf],不引用其他元素。 另一个蒙面收藏可能是猫科动物的名字,其中包含[猫,狮子]。
另一个例子:我们有许多LocalDate对象的列表。用户出于某种目的选择其中一些日期,可能只选择工作日而不选择周末。然后,用户更改其选择,对某些日期进行手动例外。与其每次都为选定的元素建立一个新的列表,一个屏蔽集合将跟踪哪些元素被选中,而其他元素将被忽略。

我将使用使用屏蔽位的过滤器类别。每个不同类型的元素将具有不同的掩码位:

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
根据要筛选的项目,可以为容器设置掩码位。因此,现在要进行过滤,您只需执行以下操作:

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

这非常快。

如果您打算根据每个元素的特征进行过滤,请参阅此方法性能较差的原因。如果你只是想根据原始支持列表中的索引进行筛选,你应该明确说明这一点。你提供的信息无法给出有意义的答案。数据结构设计的演练总是一样的。指定1需要执行的确切操作插入、删除、查询等。2它们的相对频率,3空间与时间的重要性以及任何其他权衡。只有这样,你才能考虑替代方案。不要一开始就对最佳解决方案抱有偏见。正如@mattmchhenry所指出的,一个看似应该有效的棘手解决方案往往会被一个简单的解决方案严重击败,而这个简单的解决方案却没有。你打算用过滤列表做什么?有一个很好的机会,过滤流可以使用。我可能是错的,所以请不要责怪我。访问时间将是相同的,因为您没有创建新的结构,所以您必须过滤集合。更有效的方法是在插入时对内容进行分类。可以使用HashMap,将字符串掩码作为键,将列表作为包含元素的值,这样访问会更快。但这取决于你所处理的数据的性质——是否可分离——你可能想问问自己,你是否正在这样做。如果一个更简单的设计可以接受,你就不需要把事情复杂化。问题被标记为java。@bradimus抱歉没有看到标记。不过,这个概念在java中是完全相同的。使用位掩码很快。答案是最基本的OOP概念。您希望强制对象实现功能,以便列表可以过滤它们。为什么这些对象甚至应该知道它们将在列表中或被过滤?如果列表中的对象的代码不是您自己的呢?假设我有一个列表。我如何实现您的解决方案?如果您不拥有代码,您可以包装对象。是的,这是一种权衡。您可以获得更高效的代码,但代价是它不太面向对象。