java - 如何在 Clojure 中使 Java 类不可变?

标签 java lisp clojure immutability priority-queue

我想在 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/

相关文章:

javax.net.ssl.SSLException : java. lang.RuntimeException:无法生成 DH key 对

java - 我需要请一名打字导师,从哪里开始?

java - 用 Java 打印 Microsoft Office 和 PDF 文件

Scheme:COND 在其主体中支持多个表达式的直觉是什么?

clojure - 如何在 Clojure 中比较两个正则表达式?

java - 只想使用 livecycle Designer ES3 打印特定页面

lisp - 声明Lisp函数 'pure'是否会有所帮助?

class - 不同的初始化,Common Lisp

clojure - Clojure 特殊形式 `def` 是否总是创建一个新的 Var?

clojure - Clojure 在其他平台上的实现?