我是scala的初学者,我尝试实现以下算法。 我有以下输入:
11 DFI1-MONT_TT_13 9(18) 14 IntegerType
11 SERI1-SENS_13 X(01) 06 StringType
11 DDRI1-MONT_TT_14 9(18) 12 IntegerType
11 SQRI1-SENS_14 X(01) 14 StringType
11 XCRI1-MONT_TT_15 9(18) 10 IntegerType
11 QSRI1-SENS_15 X(01) 08 StringType
11 WQRI1-DEVISE X(03) 07 StringType
我想计算每个字段的起始位置,所以输出结果如下:
11 DFI1-MONT_TT_13 9(18) 0 14 IntegerType
11 SERI1-SENS_13 X(01) 14 06 StringType
11 DDRI1-MONT_TT_14 9(18) 20 12 IntegerType
11 SQRI1-SENS_14 X(01) 32 14 StringType
11 XCRI1-MONT_TT_15 9(18) 46 10 IntegerType
11 QSRI1-SENS_15 X(01) 56 08 StringType
11 WQRI1-DEVISE X(03) 64 07 StringType
起始位置可按如下方式计算:
startposition_line_n= startposition_line_n-1 + length_line_n-1
我们假设第一行开始位置等于0
我已经知道我可以使用scanLeft
或foldLeft
但是我正在开始我现在不会如何递归地执行此操作。我从输入中的数据集中获取了一个样本,目前它包含更多的行。
答案 0 :(得分:0)
如果您需要一些说明,请删除评论。
val input = List(
"10 DFI1-MONT_TT_13 9(18) 14 IntegerType",
"10 SERI1-SENS_13 X(01) 06 StringType",
"10 DDRI1-MONT_TT_14 9(18) 12 IntegerType",
"10 SQRI1-SENS_14 X(01) 14 StringType",
"10 XCRI1-MONT_TT_15 9(18) 10 IntegerType",
"10 QSRI1-SENS_15 X(01) 08 StringType",
"10 WQRI1-DEVISE X(03) 07 StringType")
)
input.foldLeft((0, List[String]())) {
case ((sum, acc), line) => {
val sp = line.split(" ")
val si = 3
(sum + sp(si).toInt, acc :+ ((sp.take(si) :+ sum) ++ sp.takeRight(sp.size - si)).mkString(" "))
}
}._2
答案 1 :(得分:0)
这是一个尾递归方法,它以List[String]
作为输入,并生成一个新的,修改过的List[String]
作为输出。
def setPos(input :List[String]
,pos :Int=0
,acc :List[String]=List()
) :List[String] =
if (input.isEmpty) acc.reverse
else {
val line = input.head.split("\\s+")
setPos(input.tail
,pos + line(3).toInt
,line.patch(3, Seq(pos.toString), 0).mkString(" ") :: acc)
}
这假设第3个以空格分隔的字段始终是偏移整数。如果情况并非如此,则会抛出错误。