4

私は一連のリストを持っています:

(def s '((1 2) (3 4) (5 6)))

そして、このシーケンスの末尾に別のリストを追加したい、つまり

(concat-list s '(7 8))
=> '((1 2) (3 4) (5 6) (7 8))

(明らかに)機能しないさまざまなアプローチ:

(cons '((1 2)) '(3 4))
=> (((1 2)) 3 4)

(conj '(3 4) '((1 2)))
=> (((1 2)) 3 4)

(concat '((1 2)) '(3 4))
=> ((1 2) 3 4)

;; close, but wrong order...
(conj '((1 2)) '(3 4))
=> ((3 4) (1 2))

;; Note: vectors work - do I really have to convert entire 
;; structure from lists to vectors and back again?
(conj [[1 2]] [3 4])
=> [[1 2] [3 4]]

のいくつかの可能な実装は何ですかconcat-list、またはこれを行うライブラリ関数は存在しますか?

4

2 に答える 2

3

通常、このコレクションが右方向に大きくなっている場合は、ベクトルとして開始し、そのままにしておく必要があります。これが最も効率的で便利です。

ただし、このコレクションの大部分が左に大きくなり、右にはめったに大きくならない場合は、おそらく concat が最適なオプションです。

(連結 '((1 2)) [ '(3 4) ] )

concat は永続的なリストではなく、遅延シーケンスを返すことに注意してください。

コレクションが大きく、両端で頻繁に成長する場合は、finger tree や flexvec などのより高度なコレクション タイプが必要になる場合があります。

于 2013-04-28T16:14:06.930 に答える