जवाबों:
मेरा मानना है कि आप zipWithIndex की तलाश कर रहे हैं?
scala> val ls = List("Mary", "had", "a", "little", "lamb")
scala> ls.zipWithIndex.foreach{ case (e, i) => println(i+" "+e) }
0 Mary
1 had
2 a
3 little
4 lamb
प्रेषक: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
आपके पास भी भिन्नताएं हैं:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
या:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
whileलूप की तुलना करना , जो संभवतः सबसे तेज़ विकल्पों में से है।
viewआपको एक अतिरिक्त सूची बनाने और ट्रेस करने से रोकने में सक्षम होना चाहिए।
उपयोग । नक्शा में। zipWithIndex
val myList = List("a", "b", "c")
myList.zipWithIndex.map { case (element, index) =>
println(element, index)
s"${element}(${index})"
}
परिणाम:
List("a(0)", "b(1)", "c(2)")
mapकेवल एक मुद्रण के बजाय एक अनुरोध के रूप में इस्तेमाल किया foreach।
प्रस्तावित समाधान इस तथ्य से पीड़ित हैं कि वे मध्यवर्ती संग्रह बनाते हैं या चर का परिचय देते हैं जो कड़ाई से आवश्यक नहीं हैं। अंततः आपको केवल एक पुनरावृत्ति के चरणों की संख्या का ट्रैक रखना है। यह मेमोइज़िंग का उपयोग करके किया जा सकता है। परिणामी कोड की तरह लग सकता है
myIterable map (doIndexed(someFunction))
doIndexedसमारोह आंतरिक समारोह जो दोनों एक सूचकांक एक के तत्वों को प्राप्त करता है लपेटता myIterable। यह आपको जावास्क्रिप्ट से परिचित हो सकता है।
यहाँ इस उद्देश्य को प्राप्त करने का एक तरीका है। निम्नलिखित उपयोगिता पर विचार करें:
object TraversableUtil {
class IndexMemoizingFunction[A, B](f: (Int, A) => B) extends Function1[A, B] {
private var index = 0
override def apply(a: A): B = {
val ret = f(index, a)
index += 1
ret
}
}
def doIndexed[A, B](f: (Int, A) => B): A => B = {
new IndexMemoizingFunction(f)
}
}
यह पहले से ही आप सभी की जरूरत है। आप इसे इस प्रकार लागू कर सकते हैं:
import TraversableUtil._
List('a','b','c').map(doIndexed((i, char) => char + i))
जिसका परिणाम सूची में है
List(97, 99, 101)
इस तरह, आप अपने प्रभावी फ़ंक्शन को लपेटने की कीमत पर सामान्य ट्रैवर्सेबल-फ़ंक्शंस का उपयोग कर सकते हैं। ओवरहेड मेमोइज़िंग ऑब्जेक्ट और उसमें काउंटर का निर्माण है। अन्यथा यह समाधान याददाश्त या प्रदर्शन के मामले में उतना ही अच्छा (या बुरा) है जैसा कि अनइंडेक्स का उपयोग करना map। का आनंद लें!
coll.view.zipWithIndexइसके बजाय का उपयोग करेंcoll.zipWithIndex
नहीं है CountedIterator(जो आप एक सामान्य पुनरावर्तक से प्राप्त कर सकते हैं .counted के साथ) 2.7.x में। मेरा मानना है कि यह 2.8 में पदावनत (या बस हटा दिया गया) है, लेकिन यह अपने स्वयं के रोल करने के लिए पर्याप्त आसान है। आपको इट्रेटर का नाम देने में सक्षम होने की आवश्यकता है:
val ci = List("These","are","words").elements.counted
scala> ci map (i => i+"=#"+ci.count) toList
res0: List[java.lang.String] = List(These=#0,are=#1,words=#2)
या, मान लें कि आपके संग्रह में निरंतर पहुंच का समय है, तो आप वास्तविक संग्रह के बजाय अनुक्रमित की सूची को मैप कर सकते हैं:
val ls = List("a","b","c")
0.until(ls.length).map( i => doStuffWithElem(i,ls(i)) )
ls.indices.map(i => doStuffWithElem(i, ls(i))
indicesरूप में लागू किया0 until length गया है: P
Listवास्तव में गरीब था। मैंने हालांकि यह उल्लेख किया कि यह उपयुक्त है यदि आपके संग्रह में निरंतर पहुंच का समय है। उठा लेना चाहिए था Array।
का प्रयोग करें .map में .zipWithIndex मानचित्र डेटा संरचना के साथ
val sampleMap = Map("a" -> "hello", "b" -> "world", "c" -> "again")
val result = sampleMap.zipWithIndex.map { case ((key, value), index) =>
s"Key: $key - Value: $value with Index: $index"
}
परिणाम
List(
Key: a - Value: hello with Index: 0,
Key: b - Value: world with Index: 1,
Key: c - Value: again with Index: 2
)
इसे करने के दो तरीके हैं।
ZipWithIndex: स्वचालित रूप से 0 से शुरू होने वाला एक काउंटर बनाता है।
// zipWithIndex with a map.
val days = List("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")
days.zipWithIndex.map {
case (day, count) => println(s"$count is $day")
}
// Or use it simply with a for.
for ((day, count) <- days.zipWithIndex) {
println(s"$count is $day")
}
दोनों कोड का आउटपुट होगा:
0 is Sun
1 is Mon
2 is Tue
3 is Wed
4 is Thu
5 is Fri
6 is Sat
ज़िप : काउंटर बनाने के लिए स्ट्रीम के साथ ज़िप विधि का उपयोग करें। यह आपको शुरुआती मूल्य को नियंत्रित करने का एक तरीका देता है।
for ((day, count) <- days.zip(Stream from 1)) {
println(s"$count is $day")
}
परिणाम:
1 is Sun
2 is Mon
3 is Tue
4 is Wed
5 is Thu
6 is Fri
7 is Sat
zipWithIndexएक पाश / नक्शा / जो कुछ भी अंदर सूचकांक प्राप्त करने के लिए विधि का उपयोग करना था ।