2015-09-15 15 views
5

मेरे पास Map[A, Option[B]] है, Map[A, B] प्राप्त करने के लिए फ़्लैटन बनाने का सबसे अच्छा तरीका क्या है?मानचित्र के लिए मानचित्र का नक्शा

मैं एक सूची हम समतल उपयोग कर सकते हैं के लिए पता है, लेकिन इस संरचना अलग

उत्तर

13

खैर, वे एक ही नहीं है, तो आप क्या होता है परिभाषित करने के लिए अगर एक मूल्य कोई नहीं है एक तरह से की आवश्यकता होगी रहे हैं। मुझे लगता है आप, उन कुंजियों को अनदेखा करने के लिए अगर ऐसा है, तो आप एक आंशिक समारोह के साथ एकत्र कर सकते हैं चाहते हैं:

map.collect { 
    case (k, Some(v)) => k -> v 
} 

या एक के लिए-समझ

for ((k, Some(v)) <- map) yield k -> v 
+0

हाँ मुझे सटीक नहीं था कि मैं कोई भी मूल्य के साथ कुंजी नहीं चाहता, आपके उत्तर के लिए बहुत बहुत धन्यवाद! – nam

+1

वास्तव में '((के, कुछ (v)) <- मानचित्र) उपज के -> v' पर्याप्त – dk14

+0

बहुत सच है! मैं अपडेट करूंगा! क्या वह पैटर्न ऊपर से ऊपर और नीचे नहीं था, बेवकूफ ... –

1

आप कोई आपत्ति नहीं है डबल यात्रा का उपयोग करें:

map.filter(_._2.nonEmpty).mapValues(_.get) 

उदाहरण:

scala> Map(1 -> Some(1), 2 -> None).filter(_._2.nonEmpty).mapValues(_.get) 
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 

या यह निहित का उपयोग कर: तब

implicit def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList 

:

map.flatten.toMap 

या का उपयोग कर (संभावित रूप से असुरक्षित) अंतर्निहित बिना:

map flatMap flat 

उदाहरण:

scala> Map(1 -> Some(1), 2 -> None).flatten.toMap 
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 

scala> def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList 
warning: there was one feature warning; re-run with -feature for details 
flat: [K, V](kv: (K, Option[V]))List[(K, V)] 

scala> Map(1 -> Option(1), 2 -> None).flatMap(flat) 
res29: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 
+0

यह ध्यान देने योग्य है कि 'नक्शा वैल्यूज' मानचित्र पर एक दृश्य देता है, जो शायद ओपी चाहता है। – jhn

+0

@jhn निर्भर करता है, अगर नक्शा के अंदर कोड वैल्यूज मेरे उत्तर में संदर्भित पारदर्शी है, तो किसी को भी क्यों परवाह करना चाहिए? जावा-क्रमबद्धरण के लिए (यदि कोई अभी भी किसी कारण से इसका उपयोग कर रहा है), हमेशा होता है .view.force या .map (पहचान) – dk14

+0

किसी को भी क्यों परवाह करना चाहिए? प्रदर्शन। – jhn

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