8

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

4

2 回答 2

9

我认为没有一种简单的方法可以将可变数据结构包装为不可变数据结构。当新版本可以巧妙地与旧版本共享数据时,不可变数据结构变得高效,如果不访问PriorityQueue.

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

编辑:再想一想,持久优先级队列的简单实现就是将 (prio, value) 对存储在排序集中。像这样的东西:

(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)))

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

于 2009-03-22T23:15:32.710 回答
8

您不能自动使可变类不可变。人们总是可以直接调用java类并对其进行变异。

要强制不变性,您可以在 clojure 中实现它,或者扩展 java 类并在所有可变方法实现中抛出异常。

于 2009-03-23T12:32:08.770 回答