2012-10-26 33 views
6

我想要一個Clojure的數據結構:從前面 作爲一個關聯隊列有這樣的事情嗎?

    • 彈出到後
    • 讓我ASSOC指數用值(即(assoc q 0 1)將設置前到1的值)

    在Clojure中有沒有類似的東西(不幸的是PersistentQueue不滿足Nr.3),還是應該將它構建在vector的頂部?

  • +0

    你也可以在Clojure中實現一個實際的隊列對象,然後它可以與Java中的其他東西(也可能是一些Clojure域)一起工作,這些東西需要一個隊列。 – Rayne

    +0

    如果你總是添加到一端並脫去另一端,那麼你可以將它保存在一個由數字索引的地圖中。然後,您可以簡單地跟蹤分配給頭部和尾部的編號,並在您使用assoc更新值時重新映射它們。 – Bill

    回答

    0

    您可以使用sorted-map,但您必須自己實現索引部分。

    例如,要推送一個值v,可以將其與通過增加地圖中最後一個鍵所產生的鍵相關聯。要彈出,你可以解開地圖中的第一個鍵。

    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]> 
    
    0

    聽起來像是你要像Python的deque除了你一個deque可能更喜歡C++的std::deque<T>其文檔是較爲鈍的索引訪問性能。

    Java隨附java.util.Deque實現,您可以使用它,很像@ tnoda對java.util.LinkedList的建議。對於非持久性集合來說,實現非常簡單直觀,至少對於基於clojure的哈希映射和向量的「散列數組樹」來說,或者直接針對向量最初如果細節煩擾你。

    相關問題