स्काला में एक Seq और एक सूची के बीच अंतर


299

मैंने कई उदाहरणों में देखा है कि कभी-कभी एक Seq का उपयोग किया जा रहा है, जबकि अन्य समय की सूची है ...

क्या कोई भिन्नता है, पूर्व के अलावा एक स्काला प्रकार और जावा से आने वाली सूची है?

जवाबों:


408

जावा के संदर्भ में, स्काला Seqजावा का होगा List, और स्काला Listजावा का होगा LinkedList

ध्यान दें कि Seqएक है trait, जो जावा के बराबर है interface, लेकिन ऊपर और आने वाले रक्षक तरीकों के बराबर है। स्काला Listएक अमूर्त वर्ग है जो कि विस्तारित है Nilऔर ::, जिसके ठोस कार्यान्वयन हैं List

तो, जहां जावा Listएक है interface, स्काला का Listकार्यान्वयन है।

इसके अलावा, स्काला Listअपरिवर्तनीय है, जो कि मामला नहीं है LinkedList। वास्तव में, जावा के पास अपरिवर्तनीय संग्रह के बराबर नहीं है (केवल एक चीज जो केवल नई वस्तु की गारंटी देती है उसे बदला नहीं जा सकता है, लेकिन आप अभी भी पुराने को बदल सकते हैं, और इसलिए, "केवल पढ़ने के लिए" एक)।

Scala's Listको कंपाइलर और लाइब्रेरीज़ द्वारा अत्यधिक अनुकूलित किया गया है, और यह कार्यात्मक प्रोग्रामिंग में एक मौलिक डेटा प्रकार है। हालाँकि, इसकी सीमाएँ हैं और यह समानांतर प्रोग्रामिंग के लिए अपर्याप्त है। इन दिनों, Vectorसे बेहतर विकल्प है List, लेकिन आदत को तोड़ना मुश्किल है।

Seqअनुक्रमों के लिए एक अच्छा सामान्यीकरण है, इसलिए यदि आप इंटरफेस के लिए प्रोग्राम करते हैं, तो आपको इसका उपयोग करना चाहिए। नोट वहाँ वास्तव में तीन उनमें से हैं कि: collection.Seq, collection.mutable.Seqऔर collection.immutable.Seq, और यह बाद के एक है कि "डिफ़ॉल्ट" दायरे में आयात किया है।

वहाँ भी है GenSeqऔर ParSeq। बाद के तरीके समानांतर में चलते हैं जहां संभव है, जबकि पूर्व दोनों के लिए माता-पिता है Seqऔर ParSeqजब एक कोड के समानांतरवाद के लिए एक उपयुक्त सामान्यीकरण नहीं होता है। वे दोनों अपेक्षाकृत नए हैं, इसलिए लोग उन्हें अभी तक उपयोग नहीं करते हैं।


3
आरई "जावा के पास अपरिवर्तनीय संग्रह के बराबर नहीं है" , हालांकि Stringयह संग्रह नहीं है, यह जावा अक्षर से परिचित अपरिवर्तनीय वर्गों का एक उदाहरण है।
हुहंजल

15
@huynhjl यह बात बगल में है। मैं जावा में क्या मौजूद है और स्काला में क्या मौजूद है, के बीच समानताएं खींच रहा था, और अभी जावा में उत्परिवर्तनीय / अपरिवर्तनीय संग्रह की कोई अवधारणा नहीं है।
डैनियल सी। सोबरल

2
जावा में वास्तव में अपरिवर्तनीय संग्रह के बराबर है। यह नहीं है कि 'अच्छी तरह से विज्ञापित' लेकिन इसके वहाँ और जब आप बहुत अधिक जेनेरिक का उपयोग करते हैं तो आपको UnsupportedOperationExceptionइस वजह से कुछ हिट होने की संभावना है । जावा में अपरिवर्तनीय सूची) बनाने के लिए आप Collections.unmodifiableList (का उपयोग करें और इसी तरह देखते हैं सेट के लिए अन्य तरीकों, नक्शे आदि docs.oracle.com/javase/6/docs/api/java/util/...
JBX

27
@jbx सच नहीं है। यदि आप इन विधियों का उपयोग करते हैं, तो आपको एक ऐसी वस्तु मिलती है, जो इसे संशोधित करने वाली विधियों पर अपवादों को फेंक देगी, लेकिन एक अपरिवर्तनीय वस्तु नहीं। यदि मूल वस्तु के अविभाज्य वस्तु बनने के बाद संशोधित हो जाती है, तो अपरिवर्तनीय वस्तु उसको प्रतिबिंबित करेगी। तो, अचूक, हाँ, अपरिवर्तनीय, नहीं।
डैनियल सी। सोबरल

3
@jbx प्राप्त करने की विधि उस संग्रह के लिए एक संदर्भ नहीं रख सकती है जो उसे प्राप्त हुआ है और यह मानता है कि यह कभी नहीं बदलेगा, और मानक जावा पुस्तकालय में कोई प्रकार नहीं है जो गारंटी देगा कि - अपरिवर्तनीयता है। इसलिए, उदाहरण के लिए, वह प्राप्त करने की विधि थ्रेड सुरक्षा की गारंटी नहीं दे सकती है। और यह अपरिवर्तनीयता द्वारा सक्षम लगातार विशेषताओं को भी नहीं छूता है। इन सबके बिना, इसे "समतुल्य" नहीं कहा जा सकता।
डैनियल सी। सोबरल

81

एक Seq एक Iterable तत्वों का एक परिभाषित आदेश किया है। अनुक्रम apply()अनुक्रमण के लिए एक विधि प्रदान करते हैं , 0 से लेकर अनुक्रम की लंबाई तक। Seq में क्यू, रेंज, लिस्ट, स्टैक और लिंक्डलिस्ट सहित कई उपवर्ग हैं।

एक सूची एक Seq है जिसे एक अपरिवर्तनीय लिंक्ड सूची के रूप में लागू किया जाता है। पिछले-इन-आउट (LIFO) एक्सेस पैटर्न वाले मामलों में इसका सबसे अच्छा उपयोग किया जाता है।

यहाँ स्केल संग्रह से पूरा संग्रह वर्ग पदानुक्रम है :

यहां छवि विवरण दर्ज करें


2
कहाँ ऐरे (और ऐरेबफ़र)? यह एक तरह का Iterable नहीं है
पीटर

23

Seqएक गुण है जो Listलागू करता है।

यदि आप अपने कंटेनर को इस रूप में परिभाषित करते हैं Seq, तो आप किसी भी कंटेनर का उपयोग कर सकते हैं जो Seqविशेषता को लागू करता है।

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6

ध्यान दें कि

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

के लिए सिर्फ एक छोटा हाथ है:

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)

यदि कंटेनर प्रकार निर्दिष्ट नहीं है, तो अंतर्निहित डेटा संरचना डिफ़ॉल्ट हो जाती है List


18

स्काला में, एक सूची Seq से विरासत में मिलती है, लेकिन उत्पाद लागू करता है ; यहाँ सूची की उचित परिभाषा है :

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[नोट: वास्तविक परिभाषा । एक बालक के साथ और मेकअप स्काला के बहुत शक्तिशाली संग्रह ढांचे के उपयोग में फिट करने के लिए और अधिक जटिल सा, क्रम में है]


0

जैसा कि @ daniel-c-sobral ने कहा, सूची गुण Seq का विस्तार करती है और scala.collection.immutable.$colon$colon(या ::संक्षेप के लिए) द्वारा कार्यान्वित एक अमूर्त वर्ग है , लेकिन एक तरफ तकनीकी, यह ध्यान में रखते हुए कि हम जिन सूचियों और seq का उपयोग करते हैं उनमें से अधिकांश को प्रारंभिक रूप में Seq(1, 2, 3)या List(1, 2, 3)जिसे दोनों वापस करते हैं scala.collection.immutable.$colon$colon, इसलिए कोई लिख सकता है:

var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]

नतीजतन, मैं केवल एक ही बात पर बहस करूंगा कि वे मामले हैं, जिन्हें आप उजागर करना चाहते हैं, उदाहरण के लिए आप ::जिस सूची का उपयोग कर सकते हैं , उसे मैं +:Seq से निरर्थक पाता हूं और मैं व्यक्तिगत रूप से डिफ़ॉल्ट रूप से Seq से चिपक जाता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.