我想在clojure中包装java的PriorityQueue类,以便在我的程序的另一部分中使用.我想弄清楚的是,是否有任何方法以lispy方式执行此操作并使优先级队列不可变.有没有什么好方法可以做到这一点,或者我是否会更好地使用PriorityQueue作为可变数据结构?
我认为有一种简单的方法可以将可变数据结构包装为不可变数据结构.当新版本能够以巧妙的方式与旧版本共享数据时,不可变数据结构变得高效,而我无法真正看到如何在不访问内部版本的情况下完成此操作PriorityQueue
.
如果你真的想要一个持久的优先级队列,这个线程可能会很有趣 那些似乎有线性时间插入,所以如果这是一个问题,你可能需要寻找另一个实现.
编辑:第二个想法,持久优先级队列的简单实现只是将(prio,value)-pairs存储在有序集合中.像这样的东西:
(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类并在所有可变方法实现中抛出异常.