2016-09-23 18 views
1

これは私の現在のコードです。文字列を2つの整数に分割し、それらを変数に格納したい。スカラ:文字列を2つの整数に分割する

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 

Scalaでこれを行う方法はありますか?これははるかにコンパクトです。

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

発現line.split(」「)マッチ{ケースアレイ(X、Y)=>(x.toInt、y.toInt)}は整数のタプルを返すので、直接2つの整数を連結考え変数aとbが機能する。単純に次のような

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

'valのリスト(A、B)= line.split( " ").toList' – iuriisusuk

答えて

4

これは、はるかにコンパクトで

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

次のコードは、より多くの数字が文字列

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

オプションドット

val Array(a,b) = line split("\\s+") map(_.toInt) 
にある場合でも動作しますきれいです

この情報は?より具体的なケースについては

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

することができます。この

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

ちょっとしたコメント、私を修正します。 'split'はJava Stringからのメソッドであり、' String [] ' - 文字列の配列を返すので、パターンマッチはArrayと連動します。概念的に 'List [String]'または 'Iterable [String]'を返します – iuriisusuk

+0

@ysusukこれは明らかです。パターン照合のための未適用メソッドが必要です。 – pamu

+0

これははっきりしています。私はスカラ 'String'を実装すると' split 'に 'List [String]'または 'Iterable [String]'を返すと仮定していました。 'List'は' unapply'を持ち、 'Iterable'は' default'実装として 'List'にフォールバックします。 – iuriisusuk

0

何か

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 

abがあなたの必要vaiablesです。

+0

'ヴァルRES = str.split("")。私は間違っている場合、マップ(_ .Int) 'とその後のres(0)res(1) – Samar

1

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

+0

リストを使う理由は? – cheseaux

+0

@pamuの例のようにArrayでうまく動作します。それは、要素がアイデンティティ(意味)を持つとき、それがparamsまたはconfig listのリストであるなら、リストから要素を解く概念的な方法です。 intや文字列のリストだけでなく、私たちのケースでは1はテストキャスの数、2は各テストケースの要素数などです。 – iuriisusuk

0

を行いますあなたのデータポイントをカプセル化するcaseクラスを使用します


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

関連する問題