我有一系列清单:
(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
有哪些可能的实现,或者是否存在执行此操作的库函数?
答案 0 :(得分:3)
如果你发现这个系列通常会向右增长,那么你应该把它作为一个载体开始并保持这种方式。这将是最有效和方便的。
但是,如果这个集合大多数向左增长而且很少向右增长,那么concat可能是你最好的选择:
(concat '((1 2)) ['(3 4)])
请注意,concat返回一个惰性序列,而不是持久列表。
如果集合很大并且两端都经常增长,那么您可能需要更高级的集合类型,如手指树或flexvec。
答案 1 :(得分:2)
可能有更好的解决方案,但这是一种方式:
user=> s
((1 2) (3 4) (5 6))
user=> s2
(7 8)
user=> (concat s (cons s2 '()))
((1 2) (3 4) (5 6) (7 8))