4

、、、などを使用java.util.Scannerして入力を解析することに非常に精通しています。next()hasNext()nextInt()nextLine()

Scala で他に使用すべきものはありますか?

このデータは文法に従って構造化されていません。それよりもアドホックです。

たとえば、在庫があるとします。入力の各行は名前で始まり、次にそれらのアイテムの数量があり、次にそれらのアイテムの ID があります

Firetruck 2 A450M A451M
Machine 1 QZLT
Keyboard 0 

ConsoleなどのメソッドがあることがわかりますreadInt()が、入力行全体を読み取ります。に相当するものはnextInt()存在しないようです。

java.util.Scanner明らかにトリックを行います。しかし、他に使用すべきもの (たとえば、Java 型ではなく Scala を返すもの) はありますか?

4

3 に答える 3

3

better-filesは、より速く、より安全で、より慣用的な代替をjava.util.Scanner提供し、ピークやスキャンなどのより多くの操作を提供する Scala ライブラリです。

リンク: https://github.com/pathikrit/better-files#scanner

コードサンプル:

val data = (home / "Desktop" / "stocks.tsv") << s"""
| id  Stock Price   Buy
| ---------------------
| 1   AAPL  109.16  false
| 2   GOOGL 566.78  false
| 3   MSFT   39.10  true
""".stripMargin

val scanner: Scanner = data.newScanner.skip(lines = 2)

assert(scanner.peekLine == Some(" 1   AAPL  109.16  false"))
assert(scanner.peek == Some("1"))
assert(scanner.nextInt == Some(1))
assert(scanner.peek == Some("AAPL"))
assert(scanner.nextString() == Some("AAPL"))
assert(scanner.nextInt() == None)
assert(scanner.nextDouble() == Some(109.16))
assert(scanner.nextBoolean() == Some(false))

while(scanner.hasNext) {
  println(scanner.nextInt(), scanner.next(), scanner.nextDouble(), scanner.nextBoolean())
}
于 2015-09-27T21:04:24.453 に答える
1

mapスペースと改行で示される入力データを使用すると、これは のsplit各行で適切に実行できますinput

def input =
"""Firetruck 2 A450M A451M
Machine 1 QZLT
Keyboard 0"""

case class Item(name: String, quantity: Int, ids: Array[String]) 

scala> input.lines.map(_.split(" ")).map(split => Item(split(0), split(1).toInt, split.takeRight(2))).toList

res0: List[Item] = List(Item(Firetruck,2,[Ljava.lang.String;@6608842e), Item(Machine,1,[Ljava.lang.String;@391e1c57), Item(Keyboard,0,[Ljava.lang.String;@67d6b10c))

scala>res0.foreach(println(_)) 

Item(Firetruck,2,[Ljava.lang.String;@6608842e)
Item(Machine,1 [Ljava.lang.String;@391e1c57)
Item(Keyboard,0,[Ljava.lang.String;@67d6b10c)
于 2013-10-07T07:11:28.740 に答える