Scala SortedMap从对象列表中选择的SortedMap,键入对象成员

Scala SortedMap从对象列表中选择的SortedMap,键入对象成员,scala,collections,Scala,Collections,我有一张无序的地图: class O(val a: Int) Map[String, List[O]] 我想把它变成: SortedMap[String, SortedMap[Int, O]] 在O字段上键入子SortedMap 我相信一定有比下面更地道的代码 class O(val a: Int) val a: Map[String, List[O]] = Map[String, List[O]]( ("b" -> List(new O(3), new O(2))), "a" -&

我有一张无序的地图:

class O(val a: Int)
Map[String, List[O]]
我想把它变成:

SortedMap[String, SortedMap[Int, O]]
在O字段上键入子SortedMap

我相信一定有比下面更地道的代码

class O(val a: Int)

val a: Map[String, List[O]] = Map[String, List[O]]( ("b" -> List(new O(3), new O(2))), "a" -> List(new O(1), new O(2)))

val key1s = a map (_._1)

val oMapsList = ListBuffer[SortedMap[Int, O]]()

for (key1 <- key1s) { 
  val oList = a(key1)
  val key2s = oList map (_.a)

  val sortedOMap = SortedMap[Int, O]() ++ (key2s zip oList).toMap
  oMapsList += sortedOMap
}

val sortedMap = SortedMap[String, SortedMap[Int, O]]() ++ (key1s zip oMapsList).toMap
首先,设置:

scala> case class O(i: Int)
defined class O

scala> Map("a" -> List(O(1), O(2)), "b" -> List(O(2), O(3)))
res0: scala.collection.immutable.Map[java.lang.String,List[O]] = Map(a -> List(O(1), O(2)), b -> List(O(2), O(3)))
现在,导入分类地图:

scala> import collection.immutable._
import collection.immutable._
现在来看看答案


使用断开(1行代码) 使用
breakOut
——但它涉及一些不受欢迎的重复类型:

scala> res0.map({ case (s, l) => s -> (l.map(o => o.i -> o)(collection.breakOut): SortedMap[Int, O]) })(collection.breakOut): SortedMap[String, SortedMap[Int, O]]
res4: scala.collection.immutable.SortedMap[String,scala.collection.immutable.SortedMap[Int,O]] = Map(a -> Map(1 -> O(1), 2 -> O(2)), b -> Map(2 -> O(2), 3  -> O(3)))
使用单独的方法(2行代码) 或者第二种方法是使用
排序方法:

scala> def sort[K: Ordering, V](m: Traversable[(K, V)]) = SortedMap(m.toSeq: _ *)
sort: [K, V](m: scala.collection.immutable.Traversable[(K, V)])(implicit evidence$1: Ordering[K])scala.collection.immutable.SortedMap[K,V]
因此:

scala> sort(res0.mapValues(l => sort(l.map(o => o.i -> o)) ))
res13: scala.collection.immutable.SortedMap[java.lang.String,scala.collection.immutable.SortedMap[Int,O]] = Map(a -> Map(1 -> O(1), 2 -> O(2)), b -> Map(2 -> O(2), 3 -> O(3)))

那个些需要查看突破点的人的链接,oxbow_lakes不约而同地问到:)问一下,你们就会明白。除了定义为协代数的任何东西(以及没有抱怨我周五下午代码的丑陋!)
scala> sort(res0.mapValues(l => sort(l.map(o => o.i -> o)) ))
res13: scala.collection.immutable.SortedMap[java.lang.String,scala.collection.immutable.SortedMap[Int,O]] = Map(a -> Map(1 -> O(1), 2 -> O(2)), b -> Map(2 -> O(2), 3 -> O(3)))