15

4つの要素を持つ空白で文字列を分割したいと思います。

1 1 4.57 0.83

そして、最初の2つの分割がリストの最初の2つの要素であり、最後の2つがPointになるように、List [(String、String、Point)]に変換しようとしています。私は次のことをしていますが、うまくいかないようです:

Source.fromFile(filename).getLines.map(string => { 
            val split = string.split(" ")
            (split(0), split(1), split(2))
        }).map{t => List(t._1, t._2, t._3)}.toIterator
4

5 に答える 5

16

これはどう:

scala> case class Point(x: Double, y: Double)
defined class Point

scala> s43.split("\\s+") match { case Array(i, j, x, y) => (i.toInt, j.toInt, Point(x.toDouble, y.toDouble)) }
res00: (Int, Int, Point) = (1,1,Point(4.57,0.83))
于 2013-02-20T04:52:09.077 に答える
14

パターンマッチングを使用して、配列から必要なものを抽出できます。

    case class Point(pts: Seq[Double])
    val lines = List("1 1 4.34 2.34")

    val coords = lines.collect(_.split("\\s+") match {
      case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble)))
    })
于 2013-02-20T04:39:03.810 に答える
1

3番目と4番目のトークンをにPoint変換したり、行をに変換したりすることはありませんList。また、各要素をとしてではTuple3なく、としてレンダリングしListます。

以下は、あなたが探しているものとより一致しているはずです。

case class Point(x: Double, y: Double) // Simple point class
Source.fromFile(filename).getLines.map(line => { 
    val tokens = line.split("""\s+""") // Use a regex to avoid empty tokens
    (tokens(0), tokens(1), Point(tokens(2).toDouble, tokens(3).toDouble))
}).toList // Convert from an Iterator to List
于 2013-02-20T03:51:07.553 に答える
1
case class Point(pts: Seq[Double])
val lines = "1 1 4.34 2.34"

val splitLines = lines.split("\\s+") match {
  case Array(s1, s2, points @ _*) => (s1, s2, Point(points.map(_.toDouble)))
}

不思議なことに、パターンマッチングの@は変数をパターンにバインドするのでpoints @ _*、変数ポイントをパターンにバインドします*_そして*_は配列の残りの部分と一致するので、ポイントはSeq[String]になります。

于 2013-07-12T00:56:00.717 に答える
-1

タプルをリストまたはシーケンスに変換する方法があります。1つの方法は

scala> (1,2,3).productIterator.toList
res12: List[Any] = List(1, 2, 3)

しかし、ご覧のとおり、戻り値の型はAnyであり、 INTEGERではありません

さまざまなタイプに変換するには、 https: //github.com/milessabin/shapelessのHlistを使用します

于 2013-02-20T06:16:54.817 に答える