2015-02-24 3 views
11

कुछ जावा कोड को स्कैला में परिवर्तित करने के माध्यम से काम करते हुए, मैंने पाया कि स्केल के Set के लिए contains विधि है, तो containsAll विधि नहीं है। क्या मुझे बस सही विधि का नाम याद आ रहा है?स्कैला सेट के साथ, क्या जावा के सेट में सभी विधि शामिल हैं?

यहां कुछ कोड है जो मैंने अंतराल को भरने के लिए काम किया है, इसलिए मैं जल्दी से काम करने के लिए वापस आ सकता हूं। क्या यह पर्याप्त है, या क्या मुझे कुछ सूक्ष्मता याद आ रही है?

def containsAll[A](set: Set[A], subset: Set[A]): Boolean = 
    if (set.size >= subset.size) 
     subset.forall(a => set.contains(a)) 
    else 
     false 

उत्तर

17

वहाँ, subsetOf है जो परीक्षण किया जाए या नहीं एक Set के तत्वों एक और Set के भीतर समाहित कर रहे हैं। (अभिव्यक्ति के मामले में रिवर्स का प्रकार)

val set = Set(1,2,3,4) 
val subset = Set(1,2) 

scala> subset.subsetOf(set) 
res0: Boolean = true 

scala> set.subsetOf(subset) 
res1: Boolean = false 
+0

आह। बहुत अच्छा। यह थोड़ा सा counterintutive है कि यह जावा से उलट है। लेकिन यह निश्चित रूप से करता है जो मुझे चाहिए। आपकी तीव्र प्रतिक्रिया के लिए Tysvm। – chaotic3quilibrium

5

स्काला में, Set इस प्रकार, उदाहरण के लिए, इस तरह के intersect के रूप में सेट के संचालन के साथ सुसज्जित है

set.intersect(subset) == subset 

containsAll के शब्दों बता देते हैं, यहाँ तक कि subsetOf जैसा कि पहले से ही उल्लेख किया गया है सबसे संक्षिप्त साबित करता है।

+0

क्या यह बहुत बड़े आकार के सेट पर पर्याप्त रूप से कम प्रदर्शन नहीं है (लाखों प्रविष्टियों की कल्पना करें)? आईओयू, अब दो ऑपरेशन हैं, चौराहे का प्रदर्शन करते हैं और फिर समकक्ष जांच करते हैं। ऐसा लगता है कि दूसरे सेट के भीतर तत्वों के लिए पहले सेट परीक्षण के माध्यम से एक एकल पास बहुत बेहतर और कहीं अधिक प्रदर्शनकारी होगा। – chaotic3quilibrium

3

यह जोड़ना उचित है कि आप परपर उपलब्ध समेकित सहायक विधियां बना सकते हैं, यदि आप चाहते हैं कि एक अंतर्निहित समृद्ध वर्ग का उपयोग करके। तो फिर आप क्या कर सकते

implicit class RichSet[T](val x: Set[T]) extends AnyVal { 
    def containsAll(y: Set[T]): Boolean = y.subsetOf(x) 
    def containsAll(y: T*): Boolean = x.containsAll(y.toSet) 
} 

: तुम भी एक variadic अधिभार बनाने पर विचार हो सकता

Set(1, 2, 3).containsAll(Set(1, 2)) 

या:

Set(1, 2, 3).containsAll(1, 2) 
+0

बहुत अच्छी तरह से किया! मैं निश्चित रूप से इसे अपनी लाइब्रेरी में जोड़ दूंगा। – chaotic3quilibrium

+0

स्पष्ट रूप से 'AnyVal को विस्तारित' का उपयोग करने के पीछे क्या तर्क है जो इसे छोड़ने के विरोध में है? – chaotic3quilibrium

+3

यह अधिक कुशल है। दस्तावेज़ों से: "... उपयोगकर्ता द्वारा परिभाषित मूल्य वर्ग नामक AnyVal के उप-वर्ग को परिभाषित करना संभव है जिसे विशेष रूप से संकलक द्वारा माना जाता है। उचित रूप से परिभाषित उपयोगकर्ता मान वर्ग उपयोगकर्ता द्वारा परिभाषित प्रकारों पर प्रदर्शन को बेहतर बनाने का एक तरीका प्रदान करते हैं रनटाइम पर ऑब्जेक्ट आवंटन से बचें, और स्थिर विधि आमंत्रण के साथ वर्चुअल विधि इनवोकेशन को प्रतिस्थापित करके। " यहां 'AnyVal' और उपयोगकर्ता द्वारा परिभाषित मान वर्गों के बारे में और पढ़ें: http://www.scala-lang.org/api/2.11.4/index.html#scala.AnyVal –

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