我想在 clojure 中包装 java 的 PriorityQueue 类,以便在我的程序的另一部分中使用。我想弄清楚的是,是否有任何方法可以以 lispy 方式执行此操作并使优先级队列不可变。有什么好的方法可以做到这一点,还是我只是将 PriorityQueue 用作可变数据结构会更好?
最佳答案
我认为没有一种简单的方法可以将可变数据结构包装为不可变数据结构。当新版本可以巧妙地与旧版本共享数据时,不可变数据结构变得高效,如果不访问 PriorityQueue
的内部结构,我真的看不出如何做到这一点。
如果你真的想要一个持久化的优先队列this thread可能很有趣。不过,它们似乎具有线性时间插入,因此如果这是一个问题,您可能需要寻找其他实现方式。
编辑:转念一想,持久优先级队列的一个简单实现就是将 (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)))
当然,上面的代码非常有限(例如,没有多个条目)但它说明了这个想法。
关于java - 如何在 Clojure 中使 Java 类不可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671706/