2012-08-07 26 views
31

मैंने कुछ हद तक खोज की है, लेकिन अभी तक कोई अच्छा जवाब नहीं मिला है कि किसी भी प्रविष्टि को किसी मानचित्र में फ़िल्टर करने के तरीके पर कोई अच्छा जवाब नहीं मिला है।कोई भी मूल्य नहीं

val map = Map[String, Option[Int]]("one" -> Some(1), 
            "two" -> Some(2), 
            "three" -> None) 

मैं सिर्फ ("one", Some(1)) और ("two", Some(2)) जोड़ी के साथ एक नक्शे के लौटने खत्म करना चाहते हैं: मैं इस तरह एक नक्शा है कहो। मैं समझता हूं कि जब आपके पास कोई सूची है, तो यह फ़्लैटन के साथ किया जाता है, लेकिन मुझे यकीन नहीं है कि इसे मानचित्र पर प्रभाव को कुंजी और मूल्यों में विभाजित किए बिना कैसे प्राप्त किया जाए, और फिर उनसे जुड़ने का प्रयास किया जाए।

उत्तर

34

scala.collection नाम स्थान एक Map में हर संग्रह प्रकार की तरह filter विधि परिभाषित है और OptionisDefined विधि है, जो Some के लिए true और None के लिए false है।

scala> map.filter(_._2.isDefined) 
res4: scala.collection.immutable.Map[String,Option[Int]] = Map(one -> Some(1), two -> Some(2)) 
+0

नीटो। हालांकि मैंने वाक्यविन्यास का अनुमान नहीं लगाया होगा। अभी भी थोड़ा उलझन में '_.' जो मैं समझता हूं, हम इसे पहले (वर्तमान) जोड़ी के दूसरे आइटम (मान) पर जाने के लिए कह रहे हैं? – KChaloux

+2

@KChaloux इस मामले में '_' 'फ़िल्टर' विधि को पारित किए जाने वाले फ़ंक्शन शाब्दिक के पहले तर्क को संदर्भित करता है। यह 'x => x._2.isDefined' –

+0

और _2 के लिए एक लघुरूप है [Tuple] (http://www.scala-lang.org/api/current/index.html#scala.Tuple2) से आता है। – fracz

41

आप None मूल्यों को छान रहे हैं, तो आप के रूप में अच्छी Some मूल्यों एक ही समय में एक Map[String,Int] के साथ समाप्त करने के लिए निकालने सकता है::

आप के संयोजन इन दोनों द्वारा None मूल्यों को फ़िल्टर कर सकते
scala> map.collect { case (key, Some(value)) => (key, value) } 
res0: scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2) 
+0

बहुत अच्छा, मैं इसे जांचना सुनिश्चित कर दूंगा। – KChaloux

+1

मुझे लगता है कि आप टोपी के बिना दूर हो सकते हैं :-) –

6
इसके अलावा

map.filterKeys(map(_) != None)

या

for((k,v) <- map if(v!= None)) yield (k,v)

यह दृष्टिकोण एक सामान्य फ़िल्टर वैल्यू विधि प्रदान करता है जो नक्शे पर मौजूद नहीं है।
मुझे ऐसी विधि याद आती है, क्योंकि कोई भी विकल्प सही नहीं है।

[बाद में अपडेट किया गया] यह एक बेहतर संस्करण है जो प्रत्येक प्रविष्टि पर एक लुकअप नहीं करता है और अभी भी स्पष्ट रूप से स्पष्ट रूप से पढ़ता है।

map.filter({case (x,y)=> y!=None})

संबंधित मुद्दे