从scala中的文件中读取列表集合

时间:2013-08-12 13:04:23

标签: scala io

我想读一个包含两列整数的大文本文件。对于第一列恒定的每个连续拉伸,我想收集第二列作为列表。例如,以下示例

1 2
1 1
1 2
4 3
4 8
1 5
8 2
8 2
8 7

应该生成列表

2,1,2
3,8
5
2,2,7

在Scala中实现此目的的正确方法是什么?

特别是,拥有一个“懒惰”解决方案会非常好,这样我就可以处理每个列表而无需先将整个文件加载到内存中。

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用scala.io.Source逐行读取文件。使用getLines,您可以检索Iterator[String],您可以在其上映射以拆分行并将其转换为这样的整数:

val intPairs = Source.fromFile("/path/to/file").getLines.map { line =>
  line.split(" ").take(2).map(_.toInt)
}

我将连续线的分组作为练习留给你。

答案 1 :(得分:1)

val nums = """(\d+) (\d+)""".r

val tuples = io.Source.fromFile("list.txt").getLines collect {
  case nums(label, num) => (label.toInt -> num.toInt)
}

def toList(tuples: Iterator[(Int, Int)]): Iterator[Seq[Int]] = {
  if(!tuples.hasNext) Iterator.empty
  else {
    val (label, num) = tuples.next
    val (succ, rest) = tuples.span(_._1 == label)
    Iterator(num :: succ.map(_._2).toList) ++ toList(rest)
  }
}

toList(tuples)foreach(println)