2016-09-23 8 views
1

Dies ist mein aktueller Code. Ich möchte eine Zeichenfolge in zwei Ganzzahlen aufteilen und sie in Variablen speichern.Scala: Teilen einer Zeichenfolge in zwei Ganzzahlen

val line = "1 2" 
var a = 0 
var b = 0 
val c = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) } 
a = c._1 
b = c._2 

Gibt es eine Möglichkeit, so etwas in Scala zu tun? Dies ist viel kompakter.

(a,b) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) } 

Der Ausdruck line.split (“„) Spiel {case Array (x, y) => (x.toInt, y.toInt)} ein Tupel von ganzen Zahlen zurückgibt, so dachte ich, die zwei ganzen Zahlen direkt verbunden mit den Variablen a und b würde funktionieren.

+0

'val Liste (a, b) = line.split (" ") .toList' – iuriisusuk

Antwort

4

Dies ist wesentlich kompakter und sauber

val Array(a,b) = line.split("\\s+").map(_.toInt) 

Code Nach funktioniert auch, wenn es mehr Zahlen im String

val Array(a, b, _*) = line split "\\s+" map(_ toInt) 

Punkt optional

val Array(a,b) = line split("\\s+") map(_.toInt) 
sind

was ist das?

val Array(a,b) = line split "\\s+" map(_ toInt) 

Für spezifischere Fall tun dies

val Array(a, ' ', b) = "1 2".toCharArray 

Scala REPL

scala> val line = "1 2" 
line: String = "1 2" 
scala> val Array(a,b) = line.split("\\s+").map(_.toInt) 
a: Int = 1 
b: Int = 2 

scala> val line = "1 2 3 4" 
line: String = "1 2 3 4" 
scala> val Array(a, b, _*) = line split "\\s+" map(_ toInt) 
a: Int = 1 
b: Int = 2 

scala> val Array(a, ' ', b) = "1 2".toCharArray 
a: Char = '1' 
b: Char = '2' 
+0

nur ein kurzer Kommentar, korrigiere mich, wenn ich falsch liege. Pattern-Match funktioniert mit Array, weil 'split' eine Methode aus Java String ist und' String [] 'zurückgibt - also ein Array von Strings. Vom Konzept her wird es 'List [String]' oder sogar 'Iterable [String]' – iuriisusuk

+0

@ysusuk zurückgeben, das Sie unapply Methode für Musterabgleich benötigen, um zu funktionieren – pamu

+0

das ist klar. Ich stellte lediglich die Theorie auf, dass ich, wenn ich Scala 'String' implementiere, eine' List [String] 'oder' Iterable [String] 'auf' split' zurückliefern würde. "List" hat "apply" und "Iterable" wird auf "List" zurückgesetzt, da es sich um eine "Standard" -Implementierung handelt. – iuriisusuk

0

Etwas wie:

val (d, e) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) } 
0

einfach wie folgt aus:

val (a,b) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) } 
0
val str = "1 2" 

val res = str.split(" ") 
val a = res.head.toInt 
val b = res.last.toInt 

a und b sind Ihre erforderlich vaiables.

+0

' val res = str.split (""). map (_. toInt) 'und dann res (0) res (1) – Samar

1

val List(a, b) = line.split(" ").map(_.toInt).toList

+0

Warum eine Liste verwenden? – cheseaux

+0

es funktioniert sehr gut mit Array wie in @pamu Beispiel. Es ist eine konzeptionelle Möglichkeit, Elemente aus der Liste zu entpacken, wenn es die Liste der Parameter oder der Konfigurationsliste ist, also wenn die Elemente eine Identität (Bedeutung) haben. Nicht nur eine Liste von Ints oder Strings, sondern in unserem Fall 1 kann die Anzahl der Testfälle sein, 2 - kann die Anzahl der Elemente in jedem Testfall oder etwas ähnliches sein. – iuriisusuk

0

können Sie Verwendung einer case Klasse machen Sie Ihren Datenpunkt zu kapseln:


    case class Datom(x: Int, y: Int) 

    val datom = "1 2".split(" ") match { case Array(x, y) => Datom(x.toInt, y.toInt) } 
    println(s"x = ${datom.x}, y = ${datom.y}") 

Verwandte Themen