我想要一个clojure数据结构:
(assoc q 0 1)
会将前面的值设置为1)在Clojure中有类似的东西(不幸的是PersistentQueue不符合Nr.3),还是我应该在vector上构建它?
答案 0 :(得分:1)
标准Clojure中没有可以有效满足这些要求的数据结构。
在Clojure-Dev邮件列表上有一些关于将RRB树用于向量的讨论,这将是一个很好的数据结构:
不确定已经发展了多远 - 但如果您对这种数据结构感兴趣,那么绝对值得一看。
答案 1 :(得分:1)
如果您不需要数据结构的持久性,
你可以在你的Clojure程序中使用java.util.LinkedList
。
示例:
;;; Creation
user> (import 'java.util.LinkedList)
java.util.LinkedList
user> (def linked-list (LinkedList. [:a :b :c :d :e]))
#'user/linked-list
;;; Pop from the front
user> (.pop ^LinkedList linked-list)
:a
user> linked-list
#<LinkedList [:b, :c, :d, :e]>
;;; Push to the rear, but costly
user> (.addLast ^LinkedList linked-list :x)
nil
user> linked-list
#<LinkedList [:b, :c, :d, :e, :x]>
;;; Assoc (cf. (assoc linked-list 0 :y)
user> (.add ^LinkedList linked-list 0 :y)
nil
user> linked-list
#<LinkedList [:y, :b, :c, :d, :x]>
答案 2 :(得分:0)
您可以使用sorted-map,但您必须自己实施索引部分。
例如,要推送值v,您可以将其与通过递增地图中的最后一个键而生成的密钥相关联。要弹出,您可以取消地图中的第一个键。
答案 3 :(得分:0)
听起来你想要一个像python deque这样的双端队列,除了你可能更喜欢c ++ std::deque<T>
的索引访问性能特征,其文档稍微有些迟钝。
Java提供了java.util.Deque实现,您可以使用它,就像@tnoda建议的java.util.LinkedList一样。
如果你是自己编写的,那么非持久集合的实现非常简单,对我来说似乎相当直观,至少要实现针对clojure的hashmap和vector的“散列数组树”,或者最初直接针对vector如果细节惹恼了你。