簡體   English   中英

Scala相當於java.util.Scanner

[英]Scala equivalent of java.util.Scanner

我非常熟悉使用java.util.Scannernext()hasNext()nextInt()nextLine()等來解析輸入。

我還應該在Scala中使用其他東西嗎?

該數據不是根據語法構建的; 它比那更特別。

例如,假設我有一個庫存。 每行輸入都以名稱開頭,然后是這些項目的數量,然后是這些項目的ID

Firetruck 2 A450M A451M
Machine 1 QZLT
Keyboard 0 

我看到ConsolereadInt()等方法,但它讀取整行輸入; 相當於nextInt()似乎不存在。

java.util.Scanner顯然可以解決問題。 但是我還應該使用其他東西(例如,返回Scala而不是Java類型的東西)?

沒有沒有等效的Scala實現。 但我沒有看到一個原因,因為java.util.Scanner可以完美地工作,並且所有java基元類型都將隱式轉換為Scala類型。

因此,對於“例如,返回Scala而不是Java類型的東西”,Scanner將在scala中使用時返回scala類型。

使用空格和換行符表示的輸入數據可以很好地完成map並在input每一行上split

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)

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())
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM