2008-09-10 26 views
16

में एक सूची से एक तत्व लौट रहा है मैं हाल ही में स्कैला में एक शुरुआती परियोजना पर काम कर रहा हूं, और स्कैला की सूची के बारे में एक शुरुआती सवाल है।स्कैला

कहें कि मेरे पास tuples की सूची है (उदाहरण के लिए List[Tuple2[String, String]])। क्या सूची से निर्दिष्ट टुपल के पहले अवसर को वापस करने के लिए कोई सुविधा विधि है, या हाथ से सूची के माध्यम से इसे फिर से शुरू करना आवश्यक है?

उत्तर

6

आप find का उपयोग करने का प्रयास कर सकते हैं। (खोज के अद्यतन स्कैला-डॉक स्थान)

2

यदि आप स्कैला सीख रहे हैं, तो मैं Seq विशेषता पर एक अच्छा नज़र डालेगा। यह स्कैला की कार्यात्मक भलाई के लिए आधार प्रदान करता है।

+0

लिंक टूटा हुआ है। – ctford

+0

लिंक काम करता है। – akauppi

13
 
scala> val list = List(("A", "B", 1), ("C", "D", 1), ("E", "F", 1), ("C", "D", 2), ("G", "H", 1)) 
list: List[(java.lang.String, java.lang.String, Int)] = List((A,B,1), (C,D,1), (E,F,1), (C,D,2), (G,H,1)) 

scala> list find {e => e._1 == "C" && e._2 == "D"} 
res0: Option[(java.lang.String, java.lang.String, Int)] = Some((C,D,1)) 
+2

क्या कुछ वापस नहीं करना संभव है ((सी, डी, 1)) लेकिन (सी, डी, 1)? मेरा मतलब है अगर मैं सूची (1) का उपयोग करता हूं। – grass

+2

@grass यदि वापसी में ट्रिपल '(सी, डी, 1)' नहीं मिलता है तो वापसी मूल्य क्या होना चाहिए? –

+1

कोई नहीं या अपवाद या खाली सेट। यदि ट्रिपल नहीं मिला है (मेरे स्वयं के खोज() विधि को छोड़कर) वापसी मूल्य को कस्टमाइज़ करने का कोई तरीका है तो अच्छा होगा। – grass

3

एक पिछली टिप्पणी में उल्लेख किया है, find शायद यह करने के लिए सबसे आसान तरीका है। स्कैला के संग्रह में वास्तव में तीन अलग-अलग "रैखिक खोज" विधियां हैं, प्रत्येक एक अलग मूल्य लौट रहे हैं। आप जो भी उपयोग करते हैं उस पर निर्भर करता है कि आपको किस डेटा की आवश्यकता है। उदाहरण के लिए, क्या आपको एक इंडेक्स की आवश्यकता है, या आपको बस बूलियन true/false की आवश्यकता है? -

+0

क्या आप इन "रैखिक खोज" विधियों पर अधिक जानकारी दे सकते हैं? मैं एक tuple (tuple का केवल एक हिस्सा होने) की अनुक्रमणिका प्राप्त करने के लिए देख रहा हूं – krookedking

+0

वास्तव में मुझे वह मिला है जो मैं ढूंढ रहा था: '.zipWithIndex.collect {case (" partOfTuple ", _, i) => i } ' – krookedking

1

आप भी इस, जो Tuple2 कक्षा में फ़ील्ड नाम जानने की आवश्यकता नहीं है कर सकता है यह बजाय मिलान पैटर्न का उपयोग करता:

list find { case (x,y,_) => x == "C" && y == "D" } 

"पा" अच्छा है जब आप जानते हैं आप केवल एक की जरूरत है ; यदि आप सभी मिलान तत्वों या तो आप समझ के लिए "फिल्टर" या समकक्ष मीठा इस्तेमाल कर सकते हैं पता लगाना चाहते हैं:

for ((x,y,z) <- list if x == "C" && y == "D") yield (x,y,z) 
+1

आपका दूसरा उदाहरण 'फ़िल्टर' की तरह अधिक काम करता प्रतीत होता है, यानी यह * सभी * तत्वों से मेल खाने वाले तत्वों को वापस लौटाएगा, न कि प्रश्नकर्ता लेखक इसे चाहता है। –

1

यहाँ कोड है कि आप मदद कर सकता है।

मैं एक ऐसी ही मामला था, एक के जो मैं एक निश्चित व्युत्पन्न वर्ग के नोड को खोजना चाहते थे बाहर (, यहाँ A) आधार वर्ग प्रविष्टियों का संग्रह होने, यदि कोई हो (यहाँ, B)।

class A 

case class B(val name: String) extends A 

object TestX extends App { 
    val states: List[A] = List(B("aa"), new A, B("ccc")) 

    def findByName(name: String): Option[B] = { 
    states.find{ 
     case x: B if x.name == name => return Some(x) 
     case _ => false 
    } 
    None 
    } 

    println(findByName("ccc")) // "Some(B(ccc))" 
} 

यहाँ महत्वपूर्ण हिस्सा (मेरे अनुप्रयोग के लिए) है कि findByNameOption[A] लेकिन Option[B] वापस नहीं करता है।

आप इसके बजाय B वापस करने के लिए व्यवहार को आसानी से संशोधित कर सकते हैं, और अगर कोई नहीं मिला तो अपवाद फेंक दें। उम्मीद है की यह मदद करेगा।

1

पर विचार करें collectFirst जो अन्यथा पहले मिलान टपल या None के लिए Some[(String,String)] बचाता है, उदाहरण के लिए इस प्रकार है,

xs collectFirst { case [email protected](a,_) if a == "existing" => t } 
Some((existing,str)) 

scala> xs collectFirst { case [email protected](a,_) if a == "nonExisting" => t } 
None 

@ इस्तेमाल करते हुए हम t को टपल का मूल्य बाँध ताकि एक पूरी मिलान टपल एकत्र किया जा सकता ।