有谁知道将下面的inputList转换成下面所需的输出列表的好方法?
我想要创造的功能
def transformList(input:List[(String,String)]):List[(String,String)] = ???
Run Code Online (Sandbox Code Playgroud)
输入
val inputList = List(
("class","testClass1"),
("class","testClass2"),
("id","testId1"),
("class","testClassRepeat"),
("class","testClassRepeat"),
("id","testId2"),
("href","testHref1")
)
Run Code Online (Sandbox Code Playgroud)
期望的输出
List(
("class","testClass1 testClass2 testClassRepeat testClassRepeat"),
("id","testId1 testId2"),
("href","testHref1")
)
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,但我认为我没有以一种好的/有效的方式做到这一点.我目前使用的解决方案是:
谢谢,菲尔
def f(xs: List[(String, String)]): Map[String, List[String]] =
xs.foldRight(Map.empty[String, List[String]]){
(elem: (String, String), acc: Map[String, List[String]]) =>
val (key, value) = elem
acc.get(key) match {
case None => acc + (key -> List(value))
case Some(ys) => acc.updated(key, value :: ys)
}
}
scala> f(inputList)
res2: Map[String,List[String]] = Map(
href -> List(testHref1),
id -> List(testId1, testId2),
class -> List(testClass1, testClass2, testClassRepeat, testClassRepeat)
)
Run Code Online (Sandbox Code Playgroud)
也许groupBy()是你在寻找什么?
scala> inputList.groupBy(_._1)
res0: Map[String,List[(String, String)]] = Map(
href -> List((href,testHref1)),
class -> List((class,testClass1), (class,testClass2), (class,testClassRepeat), (class,testClassRepeat)),
id -> List((id,testId1), (id,testId2))
)
Run Code Online (Sandbox Code Playgroud)
在我们处理元组列表的同时清理元组列表也非常简单,例如.
scala> inputList.groupBy(_._1).map(kv => (kv._1, kv._2.map(_._2)))
res1: Map[String,List[String]] = Map(
href -> List(testHref1),
class -> List(testClass1, testClass2, testClassRepeat, testClassRepeat),
id -> List(testId1, testId2)
)
Run Code Online (Sandbox Code Playgroud)
您可以使用 groupBy 并且可以在一行中完成。
scala> inputList.groupBy(_._1).
map{ case (key, value) => (key, value.map(_._2).mkString(" "))}.toList
res0: List[(String, String)] = List(
(href,testHref1),
(class,testClass1 testClass2 testClassRepeat testClassRepeat),
(id,testId1 testId2)
)
Run Code Online (Sandbox Code Playgroud)