我想换Java的PriorityQueue的类Clojure中使用我的程序的其他部分。如果有什么办法做到这一点的lispy方式,使优先级队列一成不变我试图找出是。有没有什么好的方法可以做到这一点,还是我只是要更好使用时Queue作为一个可变的数据结构?

有帮助吗?

解决方案

我不认为有包一个可变的数据结构作为不可变的一个简单方式。不可变的数据结构变得有效时,新版本可以与旧版本的聪明的方式共享数据,我实在看不出如何能不访问PriorityQueue的内部来完成。

如果你真的想要一个持续的优先级队列这个线程可能很有趣。那些似乎有线性时间插入的,所以如果这是一个问题,也许你必须寻找另一种实现方式。

编辑:关于第二个想法,一个简单的实现持久优先级队列的只是向(PRIO,值)-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类,并在所有的可变方法实现抛出异常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top