এমন কোনও তালিকা / সিকোয়েন্স অন্তর্নির্মিত রয়েছে যা এর মতো আচরণ map
করে এবং উপাদানটির সূচকও সরবরাহ করে?
উত্তর:
আমি বিশ্বাস করি আপনি জিপউইথআইডেক্স খুঁজছেন?
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
-Function অভ্যন্তর ফাংশন যা উভয় একটি সূচক একটি উপাদান পায় গোপন 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 হবে। আমি বিশ্বাস করি এটি ২.৮-এ অবমূল্যায়ন করা হয়েছে (বা কেবল সরানো হয়েছে) তবে এটি নিজের রোল করার পক্ষে যথেষ্ট সহজ। আপনাকে পুনরাবৃত্তকারীটির নাম দিতে সক্ষম হতে হবে:
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
দেখা হচ্ছে এটি বেশ একই জিনিস: পি
List
দরিদ্র ছিল। তবে আমি উল্লেখ করেছি যে আপনার সংগ্রহে অবিচ্ছিন্ন অ্যাক্সেসের সময় থাকলে এটি উপযুক্ত। বাছাই করা উচিত ছিল Array
।
মানচিত্রের ডেটা স্ট্রাকচার সহ .zipWithIndex এ .map ব্যবহার করুন
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
)
এটি করার দুটি উপায় আছে।
জিপউইথইন্ডেক্স: 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
আপনার যদি মানচিত্রের মানগুলিও অনুসন্ধানের প্রয়োজন হয় (যেমন আমারও করতে হয়েছিল):
val ls = List("a","b","c")
val ls_index_map = ls.zipWithIndex.toMap
zipWithIndex
লুপ / ম্যাপ / যাই হোক না কেন ভিতরে সূচকটি পেতে পদ্ধতিটি ব্যবহার করেছি ।