벡터를 원할 때 lazy list를 사용하는 경우가 많으며 그 반대의 경우도 마찬가지입니다. 또한, 가끔은 맵 세트가 정말로 필요할 때 맵 벡터가 있습니다. 이러한 유형간에 변환하는 데 도움이되는 도우미 함수가 있습니까?
답변
신뢰할 수있는 old into
는 seq
가능한 모든 것 (list, vector, map, set, sorted-map)과 채우려는 빈 컨테이너를 가져 와서 넣을 수 있다는 것을 잊지 마십시오 into
.
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
conj
컬렉션 유형에 따라 컬렉션에 새 항목을 적절하게 삽입하기위한 기본 추상화 인 래퍼 입니다. 그래서 친절이 흐름을 만드는 원리는 Clojure의이 빌드에 있다는 것이다 작성 가능 추상화 ,이 경우에는 into
위에 conj
수집의 상단에 seq
.
위의 예는 수신자가 런타임에 전달되는 경우 여전히 잘 구성됩니다. 기본 추상화 ( seq
및 conj
)가 모든 컬렉션 (및 많은 Java 컬렉션에도 적용됨)에 대해 구현되므로 더 높은 추상화는 걱정할 필요가 없습니다. 많은 특수 데이터 관련 코너 케이스에 대해.
답변
vec
, set
그리고 일반적으로 into
다른 컬렉션 유형으로 쉽게 “변환”할 수있는 친구입니다.
지도 벡터를지도지도로 어떻게 변환 하시겠습니까? 키가 필요합니다. 샘플 입력 / 예상 출력과 함께 사용할 수 있습니까?
답변
벡터의 경우 vec
기능이 있습니다.
user=> (vec '(1 2 3))
[1 2 3]
게으른 시퀀스의 경우 lazy-seq
기능이 있습니다.
user=> (lazy-seq [1 2 3])
(1 2 3)
세트로 변환하는 set
기능이 있습니다.
user=> (set [{:a :b, :c :d} {:a :b} {:a :b}])
#{{:a :b} {:a :b, :c :d}}
답변
(완전성을 위해) 목록에서 맵으로 변환하는 것에 대한 또 하나의 답변- 여기에서 :
(apply hash-map '(1 2 3 4))
;=>{1 2, 3 4}
답변
벡터를 목록으로 변환하려면 for
다음과 같이 를 사용할 수도 있습니다 .
=> (for [i [1 2 3 4]] i)
(1 2 3 4)
데이터를 조작하지 않으려면 seq
벡터에서 사용 하십시오.
=> (seq [1 2 3])
(1 2 3)
답변
벡터를 목록 으로 변환 할 필요가 없습니다 . Clojure는 시퀀스가 필요할 때 목록을 시퀀스로 처리하는 것처럼 벡터를 처리합니다. 예를 들면
user=> (cons 0 [1 2 3])
(0 1 2 3)
벡터가 시퀀스로 처리되고 있는지 확인해야하는 경우 다음으로 래핑합니다 seq
.
user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]
user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)
맵 벡터가 있고 맵 세트가 필요한 경우 벡터가 맵을 보유하고 있는지는 중요하지 않습니다. 평소와 같이 벡터를 세트로 변환하면됩니다.
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}