我想将Java的PriorityQueue类包装在clojure中,以便在程序的另一部分中使用。我要弄清楚的是,是否有任何办法可以以轻松的方式执行此操作,并使优先级队列不可变。有什么好的方法可以做到这一点,还是将PriorityQueue用作可变数据结构会更好呢?

最佳答案

我认为没有一种简单的方法可以将可变数据结构包装为不可变的数据结构。当新版本可以巧妙地与旧版本共享数据时,不变的数据结构将变得高效,而且我真的看不到如果不访问PriorityQueue的内部结构怎么能做到这一点。

如果您确实想要持久优先级队列,那么this thread可能会很有趣。但是,那些似乎有线性时间插入,因此,如果这是一个问题,也许您必须寻找另一种实现。

编辑:再三考虑,持久优先级队列的简单实现只是将(优先级,值)对存储在排序集中。像这样的东西:

(defn make-pqueue []
  (sorted-set))

(defn pqueue-add [pq x prio]
  (conj pq [prio x]))

(defn pqueue-peek [pq]
  (first pq))

(defn pqueue-pop [pq]
  (let [top (first pq)]
    (disj pq top)))

当然,上面的代码非常有限(例如,没有多个条目),但是它说明了这个想法。

关于java - 如何使Clojure中的Java类不可变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/671706/

10-10 05:57