2013-04-11 20 views
5

दो सूचियों को देखते हुए a और b, a ::: b और a ++ b के बीच क्या अंतर है? मैं इन ऑपरेटरों में से एक संदिग्ध बस अन्य कहेंगे, लेकिन वास्तव में, कार्यान्वयन पूरी तरह से अलग लग रही है: एक उपयोग दृष्टिकोण सेसूची के लिए ::: और ++ के बीच क्या अंतर है?

def :::[B >: A](prefix: List[B]): List[B] = 
    if (isEmpty) prefix 
    else if (prefix.isEmpty) this 
    else (new ListBuffer[B] ++= prefix).prependToList(this) 

override def ++[B >: A, That](that: GenTraversableOnce[B]) 
         (implicit bf: CanBuildFrom[List[A], B, That]): That = { 
    val b = bf(this) 
    if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That] 
    else super.++(that) 
} 

मैं a ::: b या a ++ b को प्राथमिकता देनी चाहिए? कार्यान्वयन परिप्रेक्ष्य से, क्या कोई विशिष्ट कारण है कि इन ऑपरेटरों में से कोई एक दूसरे को क्यों नहीं बुलाता है?

+0

[स्कैला सूची concatenation, ::: बनाम ++] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/6559996/scala-list-concatenation-vs) –

उत्तर

10

अंतर यह है कि आप केवल2 सूचियों पर उपयोग कर सकते हैं - यह ऑपरेशन केवल List डेटाटाइप पर उपलब्ध है। चूंकि सूचियां अनुक्रम हैं, यह सूचियों के लिए एक संयोजन ऑपरेटर के रूप में कार्य करती है।

++ विधि अधिक सामान्य है - यह किसी भी दो संग्रहों का संघ बनाने की अनुमति देता है। यह दो सेट हो सकता है, इस मामले में यह एक संघ के रूप में कार्य करता है, या दो अनुक्रम जिसमें यह एक संगतता के रूप में कार्य करता है।

वहाँ 2 सूचियों के लिए ++ और ::: के बीच कोई अंतर नहीं है अर्थ - ::: कार्यात्मक सूचियों कि कार्यात्मक प्रोग्रामर से अधिक परिचित दिखना चाहिए के लिए ++ का संस्करण है।

if बयान आप ++ कार्यान्वयन में देखना एक अनुकूलन है - अगर दोनों this संग्रह और that संग्रह सूचियों कर रहे हैं, सिर्फ दो सूचियों को एक साथ जोड़ने के लिए सूची संयोजन ऑपरेटर ::: का उपयोग करें। अन्यथा, ++ के सामान्य कार्यान्वयन का उपयोग करें जो this और that के सभी तत्वों को That प्रकार के लिए उपयुक्त निर्माता में संग्रह जोड़ता है।

तो, सूचियों के लिए प्रासंगिक अंतर प्रदर्शन है - कार्यात्मक सूचियों के लिए आपको दूसरी सूची को सामान्य ++ कार्यान्वयन के रूप में पार करने की आवश्यकता नहीं है - केवल नई सूची के नोड्स को नया बनाने के लिए पुनर्स्थापित करने की आवश्यकता है कार्यात्मक सूची।

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