স্ক্যালায় আমি কীভাবে মানচিত্র ব্যবহার করতে পারি এবং একটি সূচিও পেতে পারি?


103

এমন কোনও তালিকা / সিকোয়েন্স অন্তর্নির্মিত রয়েছে যা এর মতো আচরণ mapকরে এবং উপাদানটির সূচকও সরবরাহ করে?

উত্তর:


150

আমি বিশ্বাস করি আপনি জিপউইথআইডেক্স খুঁজছেন?

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) )

4
ঠিক আছে, আমি zipWithIndexলুপ / ​​ম্যাপ / যাই হোক না কেন ভিতরে সূচকটি পেতে পদ্ধতিটি ব্যবহার করেছি ।
ziggystar

উদাহরণস্বরূপ একটি whileলুপের সাথে তুলনা করা , যা সম্ভবত দ্রুততম বিকল্পগুলির মধ্যে।
জিগিস্টার

একটি অ্যারে এবং কিছুক্ষণের লুপটি সম্ভবত এটি পেতে পারে তত দ্রুত।
ভিক্টর ক্লাং

4
@ জিগজিস্টার আপনি যদি পারফরম্যান্সের সন্ধান করেন তবে আপনাকে কিছুটা অপ্রচলতার বাণিজ্য করতে হবে। জিপউইথআইডেক্স ফাংশনের ভিতরে দেখুন। এটি জোড়গুলির নতুন সংগ্রহ তৈরি করতে কেবল একটি var ব্যবহার করে। আপনি জাভাতে যেমন করেছিলেন তেমনই নতুন সংগ্রহটি তৈরি না করেই কোনও ভার বাড়ানোর একই পদ্ধতিটি ব্যবহার করতে পারেন। তবে এটি কার্যকরী শৈলী নয়। আপনার যদি আসলে এটি প্রয়োজন হয় তা ভাবেন।
ক্রিশ্চিয়ান ভ্রাবী

সুতরাং এটি এমনকি zipWithIndex নিজেই কার্যকরী শৈলী নয় বলে মনে হয়। যাইহোক আমি মনে করি এটি উল্লেখ করা উচিত যে আপনার ব্যবহার করে viewএকটি অতিরিক্ত তালিকা তৈরি করা এবং ট্র্যাভার করা আটকাতে সক্ষম হওয়া উচিত।
হারমান

57

ব্যবহার। মধ্যে মানচিত্র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)")

12
এই প্রথম শালীন উদাহরণ আমি দেখেছি যে একটি ব্যবহার করে তা হল mapযেমন পরিবর্তে অনুরোধ শুধু একটি ভিতরে মুদ্রণ foreach
গ্রেগ চবালা

10

প্রস্তাবিত সমাধানগুলি এ থেকে ভোগে যে তারা মধ্যবর্তী সংগ্রহ তৈরি করে বা ভেরিয়েবলগুলি প্রবর্তন করে যা কঠোরভাবে প্রয়োজনীয় নয়। শেষ পর্যন্ত আপনাকে যা করতে হবে তা হ'ল একটি পুনরাবৃত্তির ধাপগুলির সংখ্যা ট্র্যাক করা। এটি মেমোজাইজিং ব্যবহার করে করা যেতে পারে। ফলাফল কোড মত দেখতে পারে

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। উপভোগ করুন!


4
এটি সমস্যার খুব মার্জিত সমাধান। অস্থায়ী সংগ্রহ তৈরি না করার জন্য +1। সমান্তরাল সংগ্রহে কাজ করবে না, তবে একটি খুব দুর্দান্ত সমাধান।
এফবিএল

5
আপনি যদি কোনও অস্থায়ী সংগ্রহ তৈরি করতে না চান, কেবলমাত্রcoll.view.zipWithIndexcoll.zipWithIndex
tsuna

5

নেই 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)

3

অথবা, ধরে নেওয়া আপনার সংগ্রহে অবিচ্ছিন্ন অ্যাক্সেসের সময় রয়েছে, আপনি প্রকৃত সংগ্রহের পরিবর্তে সূচকের তালিকাটি ম্যাপ করতে পারেন:

val ls = List("a","b","c")
0.until(ls.length).map( i => doStuffWithElem(i,ls(i)) )

4
এটি করার আরও একটি মার্জিত উপায় সহজভাবে: ls.indices.map(i => doStuffWithElem(i, ls(i))
অসিল ক্সিক্সি

4
@ অ্যাক্সিক্সী ঠিক আছে, indicesএটি বাস্তব হিসাবে0 until length দেখা হচ্ছে এটি বেশ একই জিনিস: পি
ক্রিশ্চিয়ান ভ্রাবী

4
জটিলতার কারণে ডাউনভোট - ls (i) দিয়ে পুনরাবৃত্তি করা O (n ^ 2) নেয়
মোশে বিক্সেনস্প্যানার

4
@ মোশেবিক্সেনশপনার ফেয়ার আমার উদাহরণটি Listদরিদ্র ছিল। তবে আমি উল্লেখ করেছি যে আপনার সংগ্রহে অবিচ্ছিন্ন অ্যাক্সেসের সময় থাকলে এটি উপযুক্ত। বাছাই করা উচিত ছিল Array
ক্রিশ্চিয়ান ভ্রাবী

1

মানচিত্রের ডেটা স্ট্রাকচার সহ .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
     )

1

এটি করার দুটি উপায় আছে।

জিপউইথইন্ডেক্স: 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

0

আপনার যদি মানচিত্রের মানগুলিও অনুসন্ধানের প্রয়োজন হয় (যেমন আমারও করতে হয়েছিল):

val ls = List("a","b","c")
val ls_index_map = ls.zipWithIndex.toMap 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.