আমি কিভাবে রূপান্তর করতে পারেন immutable.Map
করতে mutable.Map
Scala যাতে আমি মান আপডেট করতে পারেন Map
?
উত্তর:
সবচেয়ে পরিষ্কার উপায় mutable.Map
হ'ল ভারার্গস কারখানাটি ব্যবহার করা । ++
পদ্ধতির বিপরীতে , এটি CanBuildFrom
মেকানিজম ব্যবহার করে , এবং এর সুবিধা নিতে লাইব্রেরি কোডটি লেখা থাকলে আরও দক্ষ হওয়ার সম্ভাবনা রয়েছে:
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
এটি কাজ করে কারণ Map
একটিকে জোড়গুলির ক্রম হিসাবেও দেখা যায়।
: _*
অনেকটা টাইপ অ্যাসক্রিপশন এর মতো, প্রদত্ত এক্সপ্রেশনটিতে ঠিক কী টাইপ করতে হবে তা সংকলককে বলে। আপনি এখানে "এই ক্রমটি গ্রহণ করুন এবং এটি বহু সংখ্যক ভারারগ পরম হিসাবে বিবেচনা করুন" বলে মনে করতে পারেন।
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
O(1)
ধাপে ধ্রুবকটিতে ফিরে যেতে পারে । এই সৌন্দর্য হতে O(n)
, যদিও যে কিভাবে চালাক বাস্তবায়নের বিষয়ে অবশ্যই নির্ভর করে ++
করা হয়।
O(n)
। আপনি সমস্ত কিছু পরিবর্তন করার সাথে সাথে সীমাতে এটি অবশ্যই হওয়া উচিত O(n)
, যদিও আপনি সময় বাঁচানোর জন্য নতুন অনুলিপিটি স্থগিত করার চেষ্টা করতে পারেন, বা আপনি মূল মানচিত্রের পরিবর্তে চেঞ্জসেটগুলি পড়ে আপনার অ্যাক্সেসের দ্বিগুণ। কোনটি সম্ভবত সেরা ব্যবহার করে তা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে depends
Scala 2.13
কারখানার নির্মাতাদের মাধ্যমে শুরু হচ্ছে , এর সাথে প্রয়োগ করা হয়েছে .to(factory)
:
Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")
সংগ্রহ.ব্রেকআউট ব্যবহার সম্পর্কে কীভাবে?
import collection.{mutable, immutable, breakOut}
val myImmutableMap = immutable.Map(1->"one",2->"two")
val myMutableMap: mutable.Map[Int, String] = myImmutableMap.map(identity)(breakOut)
mutable.Map#apply
সঙ্গে একটি বিট আরো boilerplate,।
একটি খালি মিউটটেবল তৈরির একটি বৈকল্পিক Map
রয়েছে যা অপরিবর্তনীয় থেকে ডিফল্ট মান গ্রহণ করে Map
। আপনি কোনও মান সঞ্চয় করতে পারেন এবং যে কোনও সময় ডিফল্টকে ওভাররাইড করতে পারেন:
scala> import collection.immutable.{Map => IMap}
//import collection.immutable.{Map=>IMap}
scala> import collection.mutable.HashMap
//import collection.mutable.HashMap
scala> val iMap = IMap(1 -> "one", 2 -> "two")
//iMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))
scala> val mMap = new HashMap[Int,String] {
| override def default(key: Int): String = iMap(key)
| }
//mMap: scala.collection.mutable.HashMap[Int,String] = Map()
scala> mMap(1)
//res0: String = one
scala> mMap(2)
//res1: String = two
scala> mMap(3)
//java.util.NoSuchElementException: key not found: 3
// at scala.collection.MapLike$class.default(MapLike.scala:223)
// at scala.collection.immutable.Map$Map2.default(Map.scala:110)
// at scala.collection.MapLike$class.apply(MapLike.scala:134)
// at scala.collection.immutable.Map$Map2.apply(Map.scala:110)
// at $anon$1.default(<console>:9)
// at $anon$1.default(<console>:8)
// at scala.collection.MapLike$class.apply(MapLike.scala:134)....
scala> mMap(2) = "three"
scala> mMap(2)
//res4: String = three
ক্যাভ্যাট (রেক্স কেরের মন্তব্য দেখুন): আপনি পরিবর্তনীয় মানচিত্র থেকে আগত উপাদানগুলি সরাতে পারবেন না:
scala> mMap.remove(1)
//res5: Option[String] = None
scala> mMap(1)
//res6: String = one
স্কেল ২.১13 সহ দুটি বিকল্প রয়েছে: to
উত্স মানচিত্রের উদাহরণের from
পদ্ধতি বা গন্তব্য মানচিত্রের সহযোগী অবজেক্টের পদ্ধতি।
scala> import scala.collection.mutable
import scala.collection.mutable
scala> val immutable = Map(1 -> 'a', 2 -> 'b');
val immutable: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b)
scala> val mutableMap1 = mutable.Map.from(immutable)
val mutableMap1: scala.collection.mutable.Map[Int,Char] = HashMap(1 -> a, 2 -> b)
scala> val mutableMap2 = immutable.to(mutable.Map)
val mutableMap2: scala.collection.mutable.Map[Int,Char] = HashMap(1 -> a, 2 -> b)
আপনি দেখতে পাচ্ছেন, mutable.Map
বাস্তবায়নটি গ্রন্থাগার দ্বারা সিদ্ধান্ত নেওয়া হয়েছিল। আপনি একটি নির্দিষ্ট বাস্তবায়ন চয়ন করতে চান, উদাহরণস্বরূপ mutable.HashMap
, এর সমস্ত সংঘটন প্রতিস্থাপন mutable.Map
সঙ্গে mutable.HashMap
।