【问题标题】:Is there a Queue (PriorityQueue) implementation which is also a Set?是否有一个队列(PriorityQueue)实现也是一个集合?
【发布时间】:2010-12-24 13:14:51
【问题描述】:

我正在寻找一个PriorityQueue 实现,它也是一个Set

compareTo 的实现,如果它的元素必须不要求与equals 的实现一致。

有没有这样的java实现?

更新:我现在使用 SortedSet 作为内部集合来实现它。所以我只需要实现缺少的方法来满足队列接口。我还忘了提到它也必须是一个有界队列,因此它具有容量并在达到容量时丢弃集合的最后一个元素。

【问题讨论】:

    标签: java queue set priority-queue


    【解决方案1】:

    如果有一个具有“类似集合”行为的队列就足够了,你只是不想接受重复的条目,那么我认为,一个简单的解决方案可能是继承 PriorityQueue 并覆盖 @987654322 @、addAll()offer() 方法如:

    @Override
    public boolean offer(E e) {
      if (contains(e)) {
        return false; 
      } else {
        return super.offer(e);
      }
    }
    

    顺便说一句 - add() 在内部调用 offer(),所以也许只覆盖 offer() 方法并在那里进行检查就足够了。

    【讨论】:

    • 这是我想到的一种可能性。我只是想可能有人已经实现了这样的集合。
    【解决方案2】:

    TreeSet 是一个提供有序迭代器的集合。它实现了SortedSet 接口,该接口保证iterator 方法返回的迭代器将按升序返回集合的元素,这由它们的自然顺序(通过Comparable)确定,或者由给定的比较器确定集合在其创建时。

    【讨论】:

      【解决方案3】:

      PriorityQueue 本身将依赖于Comparitor 或项目的自然排序进行排序,同样Set 将依赖于自然排序或Comparitor 函数所以没有我不认为默认 Java 安装的一部分存在...

      但是如果速度不是问题的话,你可以很容易地创建一个

      MyQueueSet extends PriorityQueue implements Set {
          HashSet set;
          ...
      }
      

      不幸的是,Java 的 java.util.* 数据集类在不重写其代码块的情况下并不总是最容易扩展的。

      PriorityQueue 支持是一个堆排序的元素列表,因此插入一个新元素然后执行 contains(e) 测试将进行 O(n) 搜索,因为排序是基于排队的,不是 em> 在数据值上,如果您包含 HashSet 以支持 Set 功能,则可以通过两次维护数据集引用来大大缩短查找时间(请记住,Java 是按值传递并且所有对象都存在于堆上)。这应该会提高大型集合的性能。

      【讨论】:

      • 但是对象不在队列和集合之间共享...它们完全不相关...这是一种(错误的)多重继承?
      • @dfa 对象在队列和集合之间共享...只是它们的引用存储在两个集合中...我的建议与@Andreas_D 完全相同-它非常常见Java 的 Collections 工作中使用的解决方案。如果 Java 的集合更容易扩展和创建您自己的集合,它就不会那么老套了……
      • 这对我来说没有多大意义。优先级队列已经排序,因此您只需要一个正常的集合。此外,我认为在我的情况下,拥有两个集合的开销会很高,我的对象相对较小,但我有很多。
      • @Mauli PriorityQueue 是一个堆排序列表,我很确定 Set 支持是 Hash 或 Red & Black Tree 支持,具体取决于您选择的实现,因此您可以选择 O( n) 时间包含搜索或 O(log n) 或 O(1) 哈希查找,所以你是正确的,我会更新答案...
      【解决方案4】:

      PriorityQueue 是一个 AbstractCollection - 它具有与 Set 几乎相同的接口。我确信制作一个将 PriorityQueue 转换为 Set 的包装器会很容易。如果您确实需要强制执行,您可以保留插入元素的侧面哈希表以避免重复。

      我不认为 PriorityQueue 要求 compareTo 与 equals 一致。 PriorityQueue 根本不使用 equals(除了它继承的 AbstractCollection 操作?)。

      【讨论】:

      • 不,PriorityQueue 没有一致性约束,但排序集有。而且我真的不希望有两个集合包含相同的元素。
      猜你喜欢
      • 2021-12-13
      • 2011-02-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多