ঠিক আছে, সুতরাং এটি অনেক ভাল উত্তর সহ একটি খুব পুরানো প্রশ্ন, কিন্তু আমি চূড়ান্ত, সর্বাত্মক এবং সর্বশেষ, সুইস-আর্মি-ছুরি, Map
বৈদ্যুতিন সংকেতের মেরু বদল তৈরি করেছি এবং এটি পোস্ট করার জায়গা।
এটি আসলে দুটি ইনভার্টার। স্বতন্ত্র মান উপাদানগুলির জন্য একটি ...
implicit class MapInverterA[K,V](m :Map[K,V]) {
def invert :Map[V,Set[K]] =
m.foldLeft(Map.empty[V, Set[K]]) {
case (acc,(k, v)) => acc + (v -> (acc.getOrElse(v,Set()) + k))
}
}
... এবং আর একটি, মান সংগ্রহের জন্য বেশ অনুরূপ।
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable.Builder
import scala.language.higherKinds
implicit class MapInverterB[K,V,C[_]](m :Map[K,C[V]]
)(implicit ev :C[V] => TraversableOnce[V]) {
def invert(implicit bf :CanBuildFrom[Nothing,K,C[K]]) :Map[V,C[K]] =
m.foldLeft(Map.empty[V, Builder[K,C[K]]]) {
case (acc, (k, vs)) =>
vs.foldLeft(acc) {
case (a, v) => a + (v -> (a.getOrElse(v,bf()) += k))
}
}.mapValues(_.result())
}
ব্যবহার:
Map(2 -> Array('g','h'), 5 -> Array('g','y')).invert
Map('q' -> 1.1F, 'b' -> 2.1F, 'c' -> 1.1F, 'g' -> 3F).invert
Map(9 -> "this", 8 -> "that", 3 -> "thus", 2 -> "thus").invert
Map(1L -> Iterator(3,2), 5L -> Iterator(7,8,3)).invert
Map.empty[Unit,Boolean].invert
আমি একই অন্তর্নিহিত ক্লাসে উভয় পদ্ধতিই পছন্দ করতে চাই তবে যত বেশি সময় এটি অনুসন্ধান করতে ব্যয় করলাম তত বেশি সমস্যা দেখা দিয়েছে।
Map(1 -> "A", 2 -> "B", 3 -> "B").map(_.swap)
ফলাফলগুলির মধ্যেMap(A -> 1, B -> 3)