هل يجب إنشاء كائن جديد من خلط في سكالا الصفة الوراثية ؟

StackOverflow https://stackoverflow.com/questions/1810305

  •  05-07-2019
  •  | 
  •  

سؤال

في سكالا ، داعيا groupBy() على مجموعة ترجع Map حيث القيم في مجموعات ولكن أريد MultiMap.ما هي أسهل طريقة للقيام التحويل ؟ يمكن تجنب خلق جديد MultiMap و نسخ كل شيء من جديد ؟

هل كانت مفيدة؟

المحلول

أعتقد أن الجواب "لا بد من إنشاء كائن جديد من خلط في سكالا السمات ؟" "نعم".يمكنك تقليل الألم مع بعض تغليف الأجسام الضمنية التحويلات.


عن مشكلة محددة ، كنت غير قادر على إرغام groupBy(...) للعودة قابلة للتغيير خريطة قابلة للتغيير مجموعات التي سوف تحتاج إلى التفاف عليه مع "MapProxy مع MultiMap".ولكن ليس الكثير من الأسطر من التعليمات البرمجية لتنفيذ النسخة الخاصة بك من "groupBy":

package blevins.example

object App extends Application {

  implicit def multiMapable[B](c: Iterable[B]) = new {
    def groupByMM[A](f: B => A) = {
      import scala.collection.mutable._
      val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
      for (e <- c) { ret.addBinding(f(e), e) }
      ret
    } 
  }

  val c = List(1,2,3,4,5,6,7,8,9)
  val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
  mm.addBinding("alpha",12)
  println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))

}

الإضافة

هنا هو مثال على التفاف الخريطة الحالية[السلسلة ، اضبط[الباحث]] في MultiMap دون نسخ القيم:

object App extends Application {
  import scala.collection.mutable._
  val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))

  val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
    val self = seed
  }

  multiMap.addBinding("even", 8)
  println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}

لاحظ أن هذا لا يمكن القيام به على نتيجة groupBy(...) لأن البذور خريطة مطلوب أن تكون قابلة للتغيير و groupBy(...) عوائد ثابتة الخريطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top