2011-10-11 4 views
1

다음 함수를 조합했습니다. 중첩 된 (여러 계층으로 된) 맵을 취하여 일련의 평면 맵을 반환해야합니다. 그러나 현재 시퀀스 내의 시퀀스를 반환합니다.함수에서 시퀀스 반환

다른 시퀀스에서 시퀀스가 ​​중첩 된 이유를 알고있는 사람이 있습니까? 에서

(defn collapse [data & keys-coll] 
    (if (map? data) 
    (for [[k v] data] 
     (collapse v (if (nil? keys-coll) 
        (conj [] k) 
        (conj (into [] keys-coll) k)))) 
    (hash-map (flatten keys-coll) data))) 

(collapse {"a" {2011 [["a" 2011 "dan"] ["a" 2011 "ari"]] 2010 [["a" 2010 "jon"]]}}) 

결과 :

( ({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]} 
    {("a" 2010) [["a" 2010 "jon"]]}) )

예상/원하는 결과 (위와 같이 시퀀스 내에서, NOT 시퀀스 순서를 알) :

({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]} 
{("a" 2010) [["a" 2010 "jon"]]})

: 예상 결과를 일련의지도입니다. 각 맵은 복합 키와 중첩 벡터로 구성됩니다.

+0

입력 시퀀스가 ​​중첩되어 있기 때문에 출력 시퀀스가 ​​중첩됩니다. 코드가 * 수행해야 할 작업을 알지 못해서 훨씬 더 많은 도움을 줄 수는 없습니다. –

+0

@JoostDiepenmaat : 코드가 수행해야하는 작업에 대한 추가 정보를 추가했습니다. 본질적으로이 함수는 중첩 된 맵을 ** 평면 시퀀스 **로 평평하게 만듭니다. 이 함수는 원하는대로 중첩 된 맵을 병합하지만 맵 시퀀스가 ​​아닌 다른 시퀀스 * 내에 일련의 맵을 반환합니다. – Ari

답변

1

다른 시퀀스 내에서 시퀀스를 가져 오는 이유는 for이 게으른 seq을 반환하기 때문입니다. 매번 collapse이지도를 만날 때마다 호출되기 때문에 두 단계의 중첩을 제공하는지도가 두 단계 깊게 중첩 된 시퀀스를 얻게됩니다.

빠른 수정 : 그래서 같은 for 앞에 flatten을 넣어 :

(defn collapse [data & keys-coll] 
    (if (map? data) 
    (flatten 
    (for [[k v] data] 
     (collapse v (conj keys-coll k)))) 
    (hash-map (flatten keys-coll) data)) 

(당신은 또한 if 문 제거 할 수 있습니다). 어쩌면 가장 우아한 해결책은 아니지만 지금은 뇌가 얼어 버린 것 같습니다.