2012-03-04 23 views
35

में अनुमानित एक आइटम ढूंढना मैं किसी आइटम के लिए एक स्केल संग्रह खोजने की कोशिश कर रहा हूं जो कुछ अनुमानित मेल खाता है। मुझे जरूरी नहीं कि रिटर्न वैल्यू की आवश्यकता हो, केवल सूची में यह जांच कर लें कि सूची में क्या है।स्कैला

जावा में, मैं की तरह कुछ कर सकता:

return collection.find { condition1(it) && condition2(it) } != null 

स्काला में ऐसा करने का मुहावरेदार तरीका क्या है:

for (Object item : collection) { 
    if (condition1(item) && condition2(item)) { 
     return true; 
    } 
} 
return false; 

ग्रूवी में, मैं की तरह कुछ कर सकते हैं? मैं निश्चित रूप से जावा लूप शैली को स्कैला में परिवर्तित कर सकता हूं, लेकिन मुझे लगता है कि ऐसा करने के लिए एक और अधिक कार्यात्मक तरीका है।

+0

मैं idiomaticity या functionalness बारे में बहुत ज्यादा चिंता नहीं: स्काला पुस्तकालय में संग्रह 'exists' और' find' विधि (अंतर यह है कि 'find' तत्व देता है), जो के रूप में जल्द ही वापस हो जैसा कि तत्व पाया जाता है। दोनों को 'var' और' while' loop 'के साथ लागू किया गया है, जो आपके जावा कार्यान्वयन के समान दिख रहे हैं (पैरामीटर के रूप में भविष्य को छोड़कर)। – herman

उत्तर

42

उपयोग फिल्टर:

scala> val collection = List(1,2,3,4,5) 
collection: List[Int] = List(1, 2, 3, 4, 5) 

// take only that values that both are even and greater than 3 
scala> collection.filter(x => (x % 2 == 0) && (x > 3)) 
res1: List[Int] = List(4) 

// you can return this in order to check that there such values 
scala> res1.isEmpty 
res2: Boolean = false 

// now query for elements that definitely not in collection 
scala> collection.filter(x => (x % 2 == 0) && (x > 5)) 
res3: List[Int] = List() 

scala> res3.isEmpty 
res4: Boolean = true 

लेकिन आप सभी की जरूरत उपयोग exists जाँच करने के लिए है अगर:

scala> collection.exists(x => x % 2 == 0) 
res6: Boolean = true 
+0

हाँ, यह उस विधि की तरह दिखता है जिसे मैं ढूंढ रहा था। अभी भी स्कैला सीखना ... धन्यवाद। –

+7

थोड़ा सा सरल 'संग्रह मौजूद है {x => condition1 (x) && condition2 (x)} ' – 4e6

+0

@ हाँ, मैंने इसे भी –

48

परीक्षण करता है, तो मूल्य मिलान विधेय मौजूद

तुम सिर्फ परीक्षण में रुचि रखते हैं यदि कोई मान मौजूद है, तो आप इसे कर सकते हैं .... exists

scala> val l=(1 to 4) toList 
l: List[Int] = List(1, 2, 3, 4) 

scala> l exists (_>5) 
res1: Boolean = false 

scala> l exists (_<2) 
res2: Boolean = true 

scala> l exists (a => a<2 || a>5) 
res3: Boolean = true 

अन्य तरीकों (टिप्पणियों पर कुछ आधार पर):

गिनती मिलान तत्वों

गणना तत्वों कि विधेय को संतुष्ट (और देखें कि क्या गिनती> 0)

scala> (l count (_ < 3)) > 0 
res4: Boolean = true 

पहले मिलान तत्व

रिटर्निंग

पहला तत्व ढूंढें जो भविष्य को संतुष्ट करता है (जैसा कि टॉमर गैबेल और लुइगी प्लिंग द्वारा सुझाया गया है, यह अधिक कुशल होना चाहिए क्योंकि यह ठीक होने पर लौटता है डी एस एक तत्व है कि विधेय को संतुष्ट करता है, बल्कि वैसे भी पूरे सूची traversing से)

scala> l find (_ < 3) 
res5: Option[Int] = Some(1) 

// also see if we found some element by 
// checking if the returned Option has a value in it 
scala> l.find(_ < 3) isDefined 
res6: Boolean = true 

परीक्षण करता है, तो सही मूल्य मौजूद

सरल मामले में जहां हम वास्तव में केवल अगर एक विशिष्ट तत्व में है जाँच कर रहे हैं के लिए सूची

scala> l contains 2 
res7: Boolean = true 
+1

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

+3

यह 'ढूंढ' है, न कि 'ढूंढें' सबसे पहले, लेकिन हां यह पूरी सूची को फ़िल्टर करने से अधिक कुशल है –

+0

@ लुइगीप्लिंग मैंने आपके सुधार के साथ टॉमर का प्रस्ताव जोड़ा। धन्यवाद! –