আমি কীভাবে অপরিবর্তনীয় M মানচিত্রকে পরিবর্তনযোগ্য রূপান্তর করতে পারি? স্কালায় ম্যাপ?


95

আমি কিভাবে রূপান্তর করতে পারেন immutable.Mapকরতে mutable.MapScala যাতে আমি মান আপডেট করতে পারেন Map?

উত্তর:


131

সবচেয়ে পরিষ্কার উপায় mutable.Mapহ'ল ভারার্গস কারখানাটি ব্যবহার করা । ++পদ্ধতির বিপরীতে , এটি CanBuildFromমেকানিজম ব্যবহার করে , এবং এর সুবিধা নিতে লাইব্রেরি কোডটি লেখা থাকলে আরও দক্ষ হওয়ার সম্ভাবনা রয়েছে:

val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*) 

এটি কাজ করে কারণ Mapএকটিকে জোড়গুলির ক্রম হিসাবেও দেখা যায়।


4
আপনি কি ব্যাখ্যা করতে পারেন, প্যারামিটারটি পাস করার সময় আপনি দ্বিতীয় লাইনে কোন বাক্য গঠন ব্যবহার করেন? কোলন কি করে?
হেইনজি

7
: _*অনেকটা টাইপ অ্যাসক্রিপশন এর মতো, প্রদত্ত এক্সপ্রেশনটিতে ঠিক কী টাইপ করতে হবে তা সংকলককে বলে। আপনি এখানে "এই ক্রমটি গ্রহণ করুন এবং এটি বহু সংখ্যক ভারারগ পরম হিসাবে বিবেচনা করুন" বলে মনে করতে পারেন।
কেভিন রাইট

16
সংগ্রহটি গ্রন্থাগারগুলির মধ্যে কিছু সমস্যা আছে যদি এটি পরিষ্কার হয়;)
ম্যাটানস্টার

4
@ ম্যাট এটিকে এলিজযুক্ত আমদানি দিয়ে কিছুটা ছোট করা যেতে পারে তবে মনে রাখবেন যে অপরিবর্তনীয়তা ত্যাগ করা স্কালার পক্ষে খুব অ-পরিচয়মূলক নয়, একে একে আরও সহজ দেখিয়ে উত্সাহিত করব ঠিক এমনটি নয় ... কৌতূহলের বাইরে , অনুলিপি আপনি কীভাবে আরও পরিষ্কারভাবে এটি করার প্রস্তাব দিতে পারেন, যদি কোনও অনুলিপিের মাধ্যমে না হয়?
কেভিন রাইট

এটি আমার বক্তব্য, আমি পারছি না, তবে একটি আরও ভাল সংগ্রহের পাঠাগার এটি সম্ভব করে তুলতে পারে, আইএমএইচও।
ম্যাটানস্টার

42
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap

4
আপনি কি টুপিটি জানেন যে এশিপটিক সময়ের জটিলতা এটি? আমি জানি যে ক্লোজুর তার যে কোনও অবিচ্ছিন্ন সংগ্রহকে "ক্ষণস্থায়ী" একটিতে রূপান্তর করতে পারে (অর্থাত্ রৈখিকভাবে টাইপিত মিউটেশন ফাংশনগুলির সাথে একটি মিউটরেবল) এবং O(1)ধাপে ধ্রুবকটিতে ফিরে যেতে পারে । এই সৌন্দর্য হতে O(n), যদিও যে কিভাবে চালাক বাস্তবায়নের বিষয়ে অবশ্যই নির্ভর করে ++করা হয়।
জার্গ ডব্লু মিটাগ

4
@ জার্গ - আমি নিশ্চিত যে এটি হ'ল O(n)। আপনি সমস্ত কিছু পরিবর্তন করার সাথে সাথে সীমাতে এটি অবশ্যই হওয়া উচিত O(n), যদিও আপনি সময় বাঁচানোর জন্য নতুন অনুলিপিটি স্থগিত করার চেষ্টা করতে পারেন, বা আপনি মূল মানচিত্রের পরিবর্তে চেঞ্জসেটগুলি পড়ে আপনার অ্যাক্সেসের দ্বিগুণ। কোনটি সম্ভবত সেরা ব্যবহার করে তা আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে depends
রেক্স কের

4
@ রুস্তেম - মানচিত্রগুলি সীমানাবিহীন। তারা যেকোন ক্রমে তাদের মনে হবে হাজির হবে (একটি হ্যাশ মানচিত্র সহ এটি সাধারণত হ্যাশ কীটির ক্রম)। বিশেষত, অপরিবর্তনীয় মানচিত্রে সত্যিকারের ক্ষুদ্র মানচিত্রের জন্য বিশেষ কেস রয়েছে যা পরিবর্তনীয় মানচিত্রের চেয়ে পৃথক।
রেক্স কের

@ রাস্টম ম্যাপস অর্ডার করা হয় না।
ড্যানিয়েল সি সোব্রাল

5

Scala 2.13কারখানার নির্মাতাদের মাধ্যমে শুরু হচ্ছে , এর সাথে প্রয়োগ করা হয়েছে .to(factory):

Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")

4

সংগ্রহ.ব্রেকআউট ব্যবহার সম্পর্কে কীভাবে?

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,।
কেভিন রাইট

2

একটি খালি মিউটটেবল তৈরির একটি বৈকল্পিক 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

4
এটি কিছু ক্ষেত্রে কার্যকর, তবে মনে রাখবেন যে আপনি আপনার নতুন মানচিত্রে এমন একটি উপাদান মুছে ফেলতে পারবেন না যা আপনার ডিফল্ট মানচিত্রে উপস্থিত ছিল; আপনি কেবল কভার এবং ডিফল্ট উদঘাটন করতে পারেন।
রেক্স কের

ঠিক আছে, এই সমাধানটি আংশিক।
আলেকজান্ডার আজরোভ

0

স্কেল ২.১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

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