उदाहरण के लिए मान लीजिए कि मैंस्कैला में, क्या अलग-अलग आकारों की दो सूचियों को ज़िप करना संभव है?
val letters = ('a', 'b', 'c', 'd', 'e')
val numbers = (1, 2)
है यह एक सूची का निर्माण करने के
(('a',1), ('b',2), ('c',1),('d',2),('e',1))
उदाहरण के लिए मान लीजिए कि मैंस्कैला में, क्या अलग-अलग आकारों की दो सूचियों को ज़िप करना संभव है?
val letters = ('a', 'b', 'c', 'd', 'e')
val numbers = (1, 2)
है यह एक सूची का निर्माण करने के
(('a',1), ('b',2), ('c',1),('d',2),('e',1))
आपका अक्षर और अंक tuples, सूची नहीं है नहीं। तो चलो ठीक है कि
scala> val letters = List('a', 'b', 'c', 'd', 'e')
letters: List[Char] = List(a, b, c, d, e)
scala> val numbers = List(1,2)
numbers: List[Int] = List(1, 2)
अब, अगर हम उन्हें ज़िप हम नहीं वांछित परिणाम
scala> letters zip numbers
res11: List[(Char, Int)] = List((a,1), (b,2))
मिलता है चलो लेकिन वह पता चलता है कि अगर संख्या असीम फिर दोहराया गया समस्या हल की जाएगी
scala> letters zip (Stream continually numbers).flatten
res12: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1))
दुर्भाग्यवश, यह ज्ञान पर आधारित है कि संख्या अक्षरों से कम है। तो यह सब ठीक करने के लिए ऊपर
scala> ((Stream continually letters).flatten zip (Stream continually numbers).flatten take (letters.size max numbers.size)).toList
res13: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1))
सूचियों के छोटे अनिश्चित काल के दोहराया जाना चाहिए संभव है। इस मामले में यह स्पष्ट है कि numbers
कम है, लेकिन मामले में आप इसे सामान्य रूप में काम करने की जरूरत है, तो यहां आप यह कर सकते है:
def zipLongest[T](list1 : List[T], list2 : List[T]) : Seq[(T, T)] =
if (list1.size < list2.size)
Stream.continually(list1).flatten zip list2
else
list1 zip Stream.continually(list2).flatten
val letters = List('a', 'b', 'c', 'd', 'e')
val numbers = List(1, 2)
println(zipLongest(letters, numbers))
आप एक सरल एक लाइनर कर सकता है, map
विधि
val letters = List('a', 'b', 'c', 'd', 'e')
val numbers = List(1, 2)
val longZip1 = letters.zipWithIndex.map(x => (x._1, numbers(x._2 % numbers.length)))
//or, using a for loop
//for (x <- letters.zipWithIndex) yield (x._1, numbers(x._2 % numbers.size))
का उपयोग कर आप सूची डेटा के किसी भी पुन: उपयोग करने हालांकि आप को पता है की आवश्यकता होगी नहीं करना चाहते हैं क्या अंतराल हैं समय से आगे के साथ भरे जाने के लिए:
val result = (0 to (Math.max(list1.size, list2.size) - 1)) map { index =>
(list1.lift(index).getOrElse(valWhen1Empty),list2.lift(index).getOrElse(valWhen2Empty))
}
मुझे शक है इस अनंत सूचियों या पाठ्यक्रम की धाराओं के साथ अच्छी तरह से काम करेगा ...