Scala zipWithIndex对一系列字符串进行索引,对最后一个条目做一些不同的事情

时间:2017-07-10 08:59:57

标签: scala

我有Seq[String]表示文件,每个字符串都是文件中的一行。

我在遍历这些行并解析记录:

fileLines.zipWithIndex.foreach {
      case(fileLine, filePosition) => parseRecord(fileLine, filePosition)
}

现在,对于最后一条记录,我需要进行不同的解析。让我们说parseLastRecord()。什么是最好的Scala方式呢?

我的问题的主要原因是,在我已经使用的parseRecord中解析的最后一行是完全正常,但是,我没有'我想将filePosition + totalSize传递给它......

2 个答案:

答案 0 :(得分:1)

在模式匹配时,您可以检查索引并从那里调用您想要调用的任何函数。

例如。如果最后一个元素我在下面的例子中打印了一些其他元素。

List(1, 2, 3, 4).zipWithIndex.foreach{ 
    case (element, index) if index == 3 => println("last element") 
    case (element, index) => println(element)
}

输出

1
2
3
last element

所以,你的情况如下,

fileLines.zipWithIndex.foreach {
  case(fileLine, filePosition) if filePosition == fileLines.length-1 => parseLastRecord(fileLine, filePosition)
  case(fileLine, filePosition) => parseRecord(fileLine, filePosition)
}

答案 1 :(得分:1)

使用模式匹配

val l = List(1,2,3,4)
val spe = l.length - 1
l.zipWithIndex.foreach{ case(item, pos) => {pos match { case `spe` => println(s"$item $pos special"); case _ => println(s"$item $pos");}}}

在你的情况下

val last = fileLines.length - 1
fileLines.zipWithIndex.foreach {
      case(fileLine, filePosition) => {filePosition match { 
      case `last` => parseLastRecord(fileLine, filePosition)
      case _ => parseRecord(fileLine, filePosition);
}