【问题标题】:Get subSet of set by using comparator使用比较器获取集合的子集
【发布时间】:2016-02-02 11:39:56
【问题描述】:

是否可以通过某个比较器获取集合过滤的子集,并让父集合及其子集的每次更新都得到所有更改?

【问题讨论】:

  • 您的意思是在您的收藏中添加一种“触发器”,用于过滤添加到您列表中的元素吗?
  • 我认为这对于常规集合是不可能的,因为该类必须实现某种可观察接口。要么这样,要么每次都必须测试所有元素,以防原始集合中发生变化。
  • NavigableSet.subSet() 做你想做的事吗?
  • 你的意思是通过一些谓词过滤,即所有以“Ab”开头的字符串?

标签: java collections subset comparator


【解决方案1】:

NavigableSet.subSet() 调用可能会执行您想要的操作。 NavigableSet 是一个排序集,它能够创建作为基础集“视图”的子集。这些视图受您提供的值的限制,使用集合创建时提供的Comparator 或值的自然顺序。最常见的实现是TreeSet。例如,您可以这样做:

    NavigableSet<String> set = new TreeSet<>(
        Arrays.asList("b", "e", "a", "d", "c"));
    System.out.println(set);

如您所料,结果是[a, b, c, d, e]。现在您可以创建一个子集,例如从“b”到“d”(含):

    NavigableSet<String> set2 = set.subSet("b", true, "d", true);
    System.out.println(set2);

这里的输出是[b, c, d]。现在,如果您将一些元素添加到边界内和边界外的原始集合中,子集视图将更改为仅包含已添加到边界内的内容:

    set.add("a1");
    set.add("c1");
    set.add("e1");
    System.out.println(set2);

输出是[b, c, c1, d]

【讨论】:

  • 好的,我想要的是创建子集,而不是提供从“b”到“d”,而是通过一些比较器,即每秒为我选择的子集。我认为选择非连续是很棘手的,所以没有这样的通用容器。但是,如果 TreeSet 具有将元素划分为奇数和偶数的比较器。我想要使​​用该比较器的子集第一部分或第二部分。
  • @userbb 好的,我不认为 TreeSet 的比较器可以做你想做的事。比较器建立集合中所有元素的总顺序,它是集合的固定属性,在创建时建立。例如,您不能在查询操作中设置它。听起来您需要更像带有谓词的过滤器,但我认为您需要更详细地解释您的用例。我和其他人正在做一些猜测。
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多