একটি স্কালা মানচিত্রের কী এবং মান উভয়ই মানচিত্র করুন


89

স্কালার MapLikeবৈশিষ্ট্যের একটি পদ্ধতি রয়েছে

mapValues [C] (f: (B) ⇒ C): Map[A, C] 

তবে আমি মাঝে মাঝে একটি ভিন্ন ধরণের চাই:

mapKeysAndValues [C] (f: (A, B) ⇒ C): Map[A, C] 

আমি যা মিস করছি তার করার কি কোনও সহজ উপায় আছে? অবশ্যই, এটি একটি ভাঁজ দিয়ে করা যেতে পারে।

উত্তর:


167

mapসমস্ত জোড় যদিও পদ্ধতি পুনরাবৃত্তি (key, value)। আপনি এটি এর মতো ব্যবহার করতে পারেন:

val m = Map("a" -> 1, "b" -> 2)

val incM = m map {case (key, value) => (key, value + 1)}

8
আপনার যদি ইতিমধ্যে কোনও ফাংশন থাকে f : (A,B) => (A,C)তবে আপনি সহজভাবে এটি করতে পারেন m.map(f.tupled)। সাথে কাজ করে val f = (x: String, y: Int) => (x, y+1)তবে আশ্চর্যের সাথে repl অভিযোগ করে যদি আমি এর fসাথে সমান সংজ্ঞা দিই def
ড্যান বার্টন

4
কীওয়ার্ডটি caseএখানে কী অর্জন করে?
সর্বব্যাপী

{case (key, value) => ...}এই ক্ষেত্রে @ সর্বব্যাপী কেবল একটি প্যাটার্ন-মিল। mapএটিকে কোনও ফাংশন সরবরাহ করার পরিবর্তে আমি এটি একটি আংশিক ফাংশন দিচ্ছি।
দশি

দ্রষ্টব্য: caseআপনাকে এর ধাঁচে প্রকারগুলি লিখতে দেবে, তবে এটি নিরাপদ নয় কারণ এটি রানটাইম ত্রুটি তৈরি করতে পারে (কারণ এটি কেবল একটি প্যাটার্নের মিল)। এদিকে, আপনি যদি কখনও mapফাংশনের নীচে সংগ্রহের কাঠামোটি পরিবর্তন করেন যাতে ব্যাখ্যা করার মতো খুব কম বা খুব বেশি অবজেক্ট থাকে (key, value)তবে আবারও আমি আশা করি আপনি রানটাইম ত্রুটি পেয়ে যাবেন। :(
সংযুক্তিবিদ

8

এই কোড সম্পর্কে কি:

val m = Map(1 -> "one", 2 -> "two")
def f(k: Int, v: String) = k + "-" + v
m map {case (k, v) => (k, f(k, v))}

যা উত্পাদন করে:

 Map(1 -> 1-one, 2 -> 2-two)

এটি ইউটিলিটি পদ্ধতিতে প্যাকেজ করা যেতে পারে:

def mapKeysAndValues[A,B,C](input: Map[A,B], fun: (A, B) => C) = 
  input map {case(k,v) => (k, fun(k, v))}

ব্যবহার:

mapKeysAndValues(
  Map(1 -> "one", 2 -> "two"), 
  (k: Int, v: String) => k + "-" + v
)

এটি কি একইরকম নয় MapLike#transform?
হোসাম অলি


2

কিছু স্কালাজ সহ:

scala> def fst[A, B] = (x: (A, B)) => x._1
fst: [A, B]=> (A, B) => A

scala> Map(1 -> "Lorem", 2 -> "Ipsum").map(fst &&& Function.tupled(_.toString + _))
res1: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> 1Lorem, 2 -> 2Ipsum)

আমি @ টেনশির সমাধানটি আরও পছন্দ করি।


0

আপনি একটি ইউটিলিটি ক্লাস তৈরি করতে পারেন:

class MyMapLike[K,V](m:MapLike[K,V,_]){
 def mapKeysAndValues[R](f: (K, V) => R)={
   m.map{case (k,v)=> f(k,v)}
 } 
}
object MyMapLike{
 implicit def maplike2mymaplike[K,V](ml:MapLike[K,V,_]):MyMapLike[K,V]=new MyMapLike(m)

}

import MyMapLike._
Map(1 -> "one", 2 -> "two").mapKeysAndValues(k,v=>v*k)

কোড পরীক্ষা করা হয়নি তবে এটির মতো কোনওভাবে সিমিলার কাজ করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.