2010-12-01 12 views
33

में टिशल्स की एक सरणी में एक हैश-मानचित्र में कनवर्ट करें मेरे पास टुपल्स की एक सरणी है, जहां प्रत्येक ट्यूपल एक कुंजी और एक मान के साथ 2 ट्यूपल है। Tuples के इस सरणी को हैश-मानचित्र में परिवर्तित करने का सबसे साफ तरीका क्या होगा?क्लोजर

उत्तर

47
user=> (into {} [[:a 1] [:b 2]]) 
{:a 1, :b 2} 
+0

ध्यान दें कि यह दो-तत्व सरणी के सरणी के लिए भी काम करता है - आपको केवल सरणी तर्क के आस-पास '(नक्शा vec ...)' जोड़ना होगा: '({{{{{{vec-a-array -two-तत्व-सरणियों)) '। –

+0

और फिर, उन "duh" क्षणों में से एक जो आप अक्सर क्लोजर का उपयोग करते समय करते हैं। अच्छा उत्तर। – Isaac

+0

लेकिन अपेक्षाकृत महंगा है। – kotarak

5

यह मानते हुए कि "tupel" "दो elememt सरणी" का अर्थ है:

(reduce 
    (fn [m tupel] 
     (assoc m 
      (aget tupel 0) 
      (aget tupel 1))) 
    {} 
    array-of-tupels)
+0

अच्छा। यदि आपका (ओपी में) "सरणी" वास्तव में '(aget t n) 'के बजाय एक वर्ग है, तो आप' (टी n) 'का उपयोग कर सकते हैं, जो थोड़ा सा सुंदर है। – Isaac

+0

'(टी एन)' अनुक्रमों के साथ काम नहीं करता है। यह वैक्टर के साथ करता है। लेकिन फिर आप 'कम करें' के बजाय '({{{सरणी-ऑफ-वैक्टर) में आसानी से उपयोग कर सकते हैं। इस समस्या के लिए – kotarak

4
user=> (def a [[:a 4] [:b 6]]) 
user=> (apply hash-map (flatten a)) 
{:a 4, :b 6} 
+2

'flatten' अधिक है। आप MapEntry (कुंजी और मूल्य के वेक्टर) के रूप में होने वाले tuples का लाभ ले सकते हैं। – miner49r

+1

कभी भी इस तरह की स्थिति के लिए 'फ़्लैटन' का उपयोग न करें: यदि वे डेटा संरचनाएं होती हैं तो यह आपकी सभी चाबियों और मूल्यों को खुशी से फ़्लैट कर देगा! –

5

एक नक्शा MapEntry तत्वों का एक अनुक्रम है। प्रत्येक MapEntry एक कुंजी और मूल्य का एक वेक्टर है। प्रश्न में tuples पहले से ही एक MapEntry के रूप में हैं, जो चीजों को सुविधाजनक बनाता है। (यही कारण है कि into समाधान एक अच्छा है।)

user=> (reduce conj {} [[:a 1] [:b 2]]) 
{:b 2, :a 1} 
+2

अच्छी व्याख्या के लिए धन्यवाद! तो केवल 2 तत्वों का वेक्टर MapEntry है, इस प्रकार ({} [[: a 1] {: b 2}] में) काम करेगा, लेकिन ({} ['(: a 1) {: b 2}]) काम नहीं करते। इसे "java.lang.ClassCastException: clojure.lang.Keyword की त्रुटि मिलती है java.util.Map $ प्रविष्टि में नहीं डाला जा सकता है"। मुझे आश्चर्य है कि क्लोजर इस संदर्भ में सभी 2 तत्व अनुक्रमों का अनुक्रम क्यों नहीं कर सकता। यह इसे और अधिक सुसंगत बना देगा। इसका कारण क्या नहीं है? –