2011-12-12 5 views
1

에 해시의 벡터와 같은 :지도 벡터는 내가 2 차원 공간에서 점의 벡터를 가지고 Clojure의

[[0 0] [1 1] [2 2]] 

그리고 결정하는 벡터의 일부 지점과 각 지점 사이의 거리를 계산해야하는 벡터의 점은 내가 쿼리하는 점에 가장 가깝습니다. 나는 거리와 가까운 점을 모두 알고 있어야합니다, 그래서 나는이 같은 해시의 벡터합니다 :

[{:point [0 0] :dist 2.7} {:point [1 1] :dist 3.5} {:point [2 2] :dist 4.3}] 

가 어떻게 후자에 전자를 변환 할 수 있습니까? 나는이 같은 시도 :

(defn closest-point [point all-points] 
    (map #({:point % :dist (distance point %)}) all-points)) 

을하지만 오류 얻을 :

(user=> ArityException Wrong number of args (0) passed to: PersistentArrayMap clojure.lang.AFn.throwArity (AFn.java:437) 

답변

5

map 대신 for 문장을 사용하면 더 쉽게 읽을 수 있습니다. 또한, 실제로 가장 가까운 지점을 선택, 당신은 단지 min-key를 사용할 수 있습니다

(defn closest-point [point all-points] 
    (apply min-key :dist 
     (for [p all-points] 
      {:point p :dist (distance point p)}))) 
9

#({...})가 인수없이지도를 호출하려고 (fn [] ({....}))으로 확장합니다.

이 시도 :

(defn closest-point [point all-points] 
    (map (fn [p] {:point p :dist (distance point p)}) all-points)) 

또는

(defn closest-point [point all-points] 
    (map #(hash-map :point % :dist (distance point %)) all-points)) 

또는

(defn dist-info 
    [point p] 
    {:point p :dist (distance point p)}) 

(defn closest-point [point all-points] 
    (map #(dist-info point %) all-points)) 
+0

주스, 감사합니다. 나는 해쉬 주변에 #()를 생략 한 복사 및 붙여 넣기 오류가 있었는데, 나는 지금 문제에서 고쳤다. 두 번째 솔루션은 완벽하게 작동합니다! 시작 단락과 첫 번째 예제 (작동하지 않음)를 제거하면 답변을 수락합니다. –

+0

내 대답 업데이트 –

1
(defn closest-point [point all-points] 
    (map #(hash-map :point % :dist (distance point %)) all-points)                 

결과 : -

({:point [0 0], :dist 2.7} {:point [1 1], :dist 3.5} {:point [2 2], :dist 4}) 
2

어떤 코드에서 아무것도를 제거하고 단 하나의 단어를 추가하지 않고 그것을 해결에 대한 : identity

(defn closest-point [point all-points] 
    (map #(identity {:point % :dist (distance point %)}) all-points)) 
관련 문제