4

我非常熟悉使用java.util.Scannerwith next(), hasNext(), nextInt(),nextLine()等来解析输入。

还有什么我应该在 Scala 中使用的吗?

这些数据不是根据语法构造的;它比这更临时。

例如,假设我有一个库存。每行输入以名称开头,然后是这些项目的数量,然后是这些项目的 ID

Firetruck 2 A450M A451M
Machine 1 QZLT
Keyboard 0 

我看到它Console具有诸如readInt(),但读取整行输入的方法;的等价物nextInt()似乎不存在。

java.util.Scanner显然可以解决问题。但是还有什么我应该使用的(例如,返回 Scala 而不是 Java 类型的东西)?

4

3 回答 3

6

不,没有等效的 Scala 实现。但是我看不出一个原因,因为 java.util.Scanner 可以完美地工作,并且所有 java 基元类型都会隐式转换为 Scala 类型。

因此,对于“例如,返回 Scala 而不是 Java 类型的东西”,Scanner 在 scala 中使用时将返回 scala 类型。

于 2013-10-07T05:25:02.003 回答
3

Better-files是一个 Scala 库,它提供更快、更安全和更惯用的替换,java.util.Scanner并提供更多操作,如窥视和扫描。

链接: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

使用空格和换行符表示的输入数据,这可以很好地使用mapsplit的每一行来完成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 回答