2016-05-02 5 views
2

Aus irgendeinem seltsamen Grund gibt es diese eine Methode merged, die nur in scala.collection.immutable.HashMap, aber nicht in generischen Map Eigenschaft (vielleicht seine Implementierung macht es sehr ungenießbar zu anderen Map Implementierungen?) Deklariert.Wie konvertiert man von scala Map zu scala.collection.immutable.HashMap?

Also ich muss meine Map[A, B] zu HashMap[A, B] konvertieren und bis jetzt kann ich keinen einfachen Weg finden, dies zu tun. Dies ist meine aktuelle Implementierung zu hack um def to[Col[_]], die unäre höher-art anstelle von binary höher-art erwartet.

val m1 = Map("foo" -> 1) 
val m2 = Map("foo" -> 2, "bar" -> 2) 

type HM[_] = HashMap[String, Int] 
(m1.to[HM] merged m2.to[HM]) { case ((k1, v1), (k2, v2)) => (k1, v1 + v2) } // Map("foo" -> 3, "bar" -> 2) 

Es funktioniert wie erwartet, aber ich kann nicht umhin zu denken, muss es eine bessere Art und Weise sein, von Map zu HashMap zu konvertieren (da es ist die Default-Implementierung).

Oder vielleicht in allgemeineren, besseren Weg, um auf Standard-Implementierung von Scala-Sammlung generische Merkmale zuzugreifen?

+0

Vielleicht 'HashMap (m1.toSeq: _ *)'? Weitere Optionen zum Zusammenführen von Karten finden Sie unter http://stackoverflow.com/questions/7076128/best-way-to-merge-two-maps-and-sum-the-values-of-same-key. –

+0

Wenn Sie Operationen verwenden, die nur in 'HashMap' verfügbar sind, warum deklarieren Sie Ihre Maps nicht als' HashMap'? –

+0

@ Łukasz Ja, ich habe diese Frage gesehen, aber dieser Teil meines Codes ist sehr leistungsempfindlich und die Verwendung von 'toSeq' erfordert 2 Iterationen. Auf der gleichen Note ist "fusioniert" angeblich sehr effizient, also wäre es schön, es zu benutzen. –

Antwort

0

Sie können mit einem leeren HashMap beginnen und alle Elemente dort hinzufügen:

immutable.HashMap.empty ++= yourMap 
+0

OP wollte 'immutable.HashMap' –

+0

@ Łukasz: behoben, auch nicht viel Unterschied – Roman

+0

Das sollte nur' ++ ', nicht' ++ = 'sein. – Ben

0

Dies wird Ihre Frage nicht beantworten, aber es ist eine Lösung für Ihr Problem. Es wird schneller gerade:

  1. Implementieren Sie die merged Methode, die Sie für die Karte benötigen,
  2. Verwenden Sie die ++ Methode auf der Karte definiert, um eine Zusammenführung zu machen.