不确定如何以最佳方式在Scala中执行此列表转换

Phi*_*yen 10 scala

有谁知道将下面的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)

我有一个解决方案,但我认为我没有以一种好的/有效的方式做到这一点.我目前使用的解决方案是:

  1. 创建一个空的可变映射
  2. 使用.foreach遍历inputList
  3. 将基于inputList的键/值推送到可变映射中.然后附加到现有键的值(如果适用)(例如,我的inputList示例中有4个"类".)

谢谢,菲尔

Kev*_*ith 9

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)


hez*_*amu 5

也许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)


cur*_*ous 4

您可以使用 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)