具有相同标题的串联线

时间:2018-05-31 07:08:12

标签: scala

我有以下问题 在输入中给出这个列表,我想为具有相同标题的每一行连接整数,

val listIn= List("TitleB,Int,11,0",              
                  "TitleB,Int,1,0",               
                  "TitleB,Int,1,0",               
                   "TitleB,Int,3,0",
                   "TitleA,STR,3,0",
                    "TitleC,STR,4,5")

我写了以下函数

def sumB(list: List[String]): List[String] = {
  val itemPattern = raw"(.*)(\d+),(\d+)\s*".r
  list.foldLeft(ListMap.empty[String, (Int,Int)].withDefaultValue((0,0))) {
    case (line, stri) =>
      val itemPattern(k,i,j) = stri 
      val (a, b) = line(k)
      line.updated(k, (i.toInt + a, j.toInt + b))
  }.toList.map { case (k, (i, j)) => s"$k$i,$j" }
}

预期输出为:

List("TitleB,Int,16,0",
     "TitleA,STR,3,0",
     "TitleC,STR,4,5")

1 个答案:

答案 0 :(得分:0)

由于您希望保留输入数据中出现的标题顺序,我建议您使用LinkedHashMap和foldLeft,如下所示

val finalResult = listIn.foldLeft(new mutable.LinkedHashMap[String, (String, String, Int, Int)]){ (x, y) => {

      val splitted = y.split(",")

      if(x.keySet.contains(Try(splitted(0)).getOrElse(""))){
        val oldTuple = x(Try(splitted(0)).getOrElse(""))
        x.update(Try(splitted(0)).getOrElse(""), (Try(splitted(0)).getOrElse(""), Try(splitted(1)).getOrElse(""), oldTuple._3+Try(splitted(2).toInt).getOrElse(0), oldTuple._4+Try(splitted(3).toInt).getOrElse(0)))
        x
      }
      else {
        x.put(Try(splitted(0)).getOrElse(""), (Try(splitted(0)).getOrElse(""), Try(splitted(1)).getOrElse(""), Try(splitted(2).toInt).getOrElse(0), Try(splitted(3).toInt).getOrElse(0)))
        x
      }
    }}.mapValues(iter => iter._1+","+iter._2+","+iter._3+","+iter._4).values.toList

finalResult应该是您想要的输出

List("TitleB,Int,16,0", "TitleA,STR,3,0", "TitleC,STR,4,5")