我想要一個Clojure的數據結構:從前面 作爲一個關聯隊列有這樣的事情嗎?
- 彈出到後
- 讓我ASSOC指數用值(即
(assoc q 0 1)
將設置前到1的值)
在Clojure中有沒有類似的東西(不幸的是PersistentQueue不滿足Nr.3),還是應該將它構建在vector的頂部?
我想要一個Clojure的數據結構:從前面 作爲一個關聯隊列有這樣的事情嗎?
(assoc q 0 1)
將設置前到1的值)在Clojure中有沒有類似的東西(不幸的是PersistentQueue不滿足Nr.3),還是應該將它構建在vector的頂部?
標準Clojure中沒有數據結構可以有效地滿足這些要求。
有Clojure的-dev郵件列表上的一些談論使用RRB樹木的載體,這將是一個很好的數據結構:
不知道多遠,那已經發展 - 但如果您對這種數據結構感興趣,那麼絕對值得一看。
您可以使用sorted-map,但您必須自己實現索引部分。
例如,要推送一個值v,可以將其與通過增加地圖中最後一個鍵所產生的鍵相關聯。要彈出,你可以解開地圖中的第一個鍵。
如果您不需要數據結構的持久性,您可以在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]>
聽起來像是你要像Python的deque除了你一個deque可能更喜歡C++的std::deque<T>
其文檔是較爲鈍的索引訪問性能。
Java隨附java.util.Deque實現,您可以使用它,很像@ tnoda對java.util.LinkedList的建議。對於非持久性集合來說,實現非常簡單直觀,至少對於基於clojure的哈希映射和向量的「散列數組樹」來說,或者直接針對向量最初如果細節煩擾你。
你也可以在Clojure中實現一個實際的隊列對象,然後它可以與Java中的其他東西(也可能是一些Clojure域)一起工作,這些東西需要一個隊列。 – Rayne
如果你總是添加到一端並脫去另一端,那麼你可以將它保存在一個由數字索引的地圖中。然後,您可以簡單地跟蹤分配給頭部和尾部的編號,並在您使用assoc更新值時重新映射它們。 – Bill