是否存在关联队列?

时间:2012-10-26 05:51:22

标签: clojure

我想要一个clojure数据结构:

  • 从前面弹出
  • 推到后面
  • 让我将索引与值相关联(即(assoc q 0 1)会将前面的值设置为1)

在Clojure中有类似的东西(不幸的是PersistentQueue不符合Nr.3),还是我应该在vector上构建它?

4 个答案:

答案 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如果细节惹恼了你。