如何解决在Scala集合的.groupBy操作中维持顺序
我有以下代码段:
object Main1 extends App {
sealed trait XYZ
{
def id : String
}
class Test() extends XYZ {
override def id: String = "Test"
}
class ABC() extends XYZ {
override def id: String = "ABC"
}
val a: List[XYZ] = List(new Test(),new ABC())
val b: Map[String,List[XYZ]] = a.groupBy(_.id)
println(b)
val c: List[XYZ] = List(new ABC(),new Test())
val d: Map[String,List[XYZ]] = c.groupBy(_.id)
println(d)
}
输出如下:
Map(Test -> List(Main1$Test@7dc5e7b4),ABC -> List(Main1$ABC@1ee0005))
Map(Test -> List(Main1$Test@3d012ddd),ABC -> List(Main1$ABC@6f2b958e))
如何保持输入集合中结果的顺序?
解决方法
如果您不仅限于使用不可变集合,那么可以使用mutable.LinkedHashMap
轻松完成:
import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
object Main1 extends App {
sealed trait XYZ
{
def id : String
}
class Test() extends XYZ {
override def id: String = "Test"
}
class ABC() extends XYZ {
override def id: String = "ABC"
}
val a: List[XYZ] = List(new Test(),new ABC())
val b: mutable.LinkedHashMap[String,ArrayBuffer[XYZ]] = a.foldLeft(mutable.LinkedHashMap.empty[String,ArrayBuffer[XYZ]]) { (m,x) =>
m.getOrElseUpdate(x.id,new ArrayBuffer[XYZ]) += x
m
}
println(b)
val c: List[XYZ] = List(new ABC(),new Test())
val d: mutable.LinkedHashMap[String,ArrayBuffer[XYZ]] = c.foldLeft(mutable.LinkedHashMap.empty[String,new ArrayBuffer[XYZ]) += x
m
}
println(d)
}
输出保持输入集合的顺序:
LinkedHashMap(Test -> ArrayBuffer(com.github.plokhotnyuk.jsoniter_scala.examples.Main1$Test@56cbfb61),ABC -> ArrayBuffer(com.github.plokhotnyuk.jsoniter_scala.examples.Main1$ABC@1134affc))
LinkedHashMap(ABC -> ArrayBuffer(com.github.plokhotnyuk.jsoniter_scala.examples.Main1$ABC@1b0375b3),Test -> ArrayBuffer(com.github.plokhotnyuk.jsoniter_scala.examples.Main1$Test@2f7c7260))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。