【发布时间】:2019-08-22 14:36:06
【问题描述】:
我正在使用 Scala 处理 XML,并将 XML 转换为我自己的数据结构。目前,我使用普通的 Map 实例来保存(子)元素,但是,XML 中元素的顺序会以这种方式丢失,并且我无法重现原始 XML。
因此,我想使用LinkedHashMap 实例而不是Map,但是我在节点列表上使用groupBy,这会创建一个Map:
例如:
def parse(n:Node): Unit =
{
val leaves:Map[String, Seq[XmlItem]] =
n.child
.filter(node => { ... })
.groupBy(_.label)
.map((tuple:Tuple2[String, Seq[Node]]) =>
{
val items = tuple._2.map(node =>
{
val attributes = ...
if (node.text.nonEmpty)
XmlItem(Some(node.text), attributes)
else
XmlItem(None, attributes)
})
(tuple._1, items)
})
...
}
在此示例中,我希望 leaves 的类型为 LinkedHashMap 以保留 n.child 的顺序。我怎样才能做到这一点?
注意:我按标签/标记名分组,因为元素可以出现多次,并且对于每个标签/标记名,我在我的数据结构中保留一个元素列表。
解决方案
正如@jwvh 所回答的那样,我使用foldLeft 作为groupBy 的替代品。另外,我决定使用LinkedHashMap 而不是ListMap。
def parse(n:Node): Unit =
{
val leaves:mutable.LinkedHashMap[String, Seq[XmlItem]] =
n.child
.filter(node => { ... })
.foldLeft(mutable.LinkedHashMap.empty[String, Seq[Node]])((m, sn) =>
{
m.update(sn.label, m.getOrElse(sn.label, Seq.empty[Node]) ++ Seq(sn))
m
})
.map((tuple:Tuple2[String, Seq[Node]]) =>
{
val items = tuple._2.map(node =>
{
val attributes = ...
if (node.text.nonEmpty)
XmlItem(Some(node.text), attributes)
else
XmlItem(None, attributes)
})
(tuple._1, items)
})
【问题讨论】:
标签: scala list sorting hashmap