2016-08-17 5 views
0

私はこのような配列データを持っています:[("Bob",5),("Andy",10),("Jim",7),...(x,y)]スカラ - パターン内の自動イテレータの一致

Scalaでパターンマッチングを行うにはどうすればいいですか?そう、彼らは(一つ一つの代わりの定義「ケース」)私はこのようないけないわけ

、私が提供した配列データに基づいて自動的に擬似コードにマッチします:

val x = y.match { 
case "Bob" => get and print Bob's Score 
case "Andy" => get and print Andy's Score 
.. 
} 

けど

val x = y.match { 
case automatically defined by given Array => print each'score 
} 

アイデア?

+0

「クロスタグ」しないでください。これはスカラーだけの質問なので、javaタグを付けないでください! – GhostCat

+0

@GhostCat削除しました – anunixercoder

+0

希望の出力は何ですか? – Nyavro

答えて

0

val xs = Array(("Bob",5),("Andy",10),("Jim",7)) 

for ((name,n) <- xs) println(s"$name scores $n") 

とも

xs.foreach { t => println(s"{t._1} scores ${t._2}") } 
xs.foreach { t => println(t._1 + " scores " + t._2) } 
xs.foreach(println) 

xsの内容を印刷するための簡単な方法を考えてみましょう事前に感謝、mkStringxsの外に列を作成します

println(xs.mkString(",")) 

と各項目を通信で区切りますa。


寄せ集めではScalaのArrayにパターンマッチングを説明するために

を指摘し、我々は最初のタプルを抽出し、残りを無視最初のケースで

val x = xs match { 
    case Array(t @ ("Bob", _), _*) => println("xs starts with " + t._1) 
    case Array()     => println("xs is empty") 
    case _       => println("xs does not start with Bob") 
} 

を検討してください。最初のタプルでは、​​文字列"Bob"と一致し、2番目の項目は無視されます。さらに、最初のタプルをタグtにバインドします。これは、最初の項目を参照する印刷で使用されます。

第2の場合は、を除くすべての場合は、を意味します。

+1

これは、各スコアを印刷する方法ですが、これは問題に対処していないと思います。言い換えれば、OPは名前とスコアを抽出するために 'map'(あるいは' collect')とdestructuring-pattern-matchを望んでいますか? –

+0

@TheArchetypalPaul Definite – elm

0

印刷し、配列に結果を格納するには、以下がうまくいくよりも、あなたの主な関心事である場合:

val ls = Array(("Bob",5),("Andy",10),("Jim",7)) 
ls.map({case (x,y) => println(y); y}) // print and store the score in an array 
0

質問について少し混乱し、しかし、あなただけの配列I内のすべてのデータを印刷したい場合

val list = Array(("Foo",3),("Tom",3)) 
list.foreach{ 
    case (name,score) => 
    println(s"$name scored $score") 

} 
//output: 
//Foo scored 3 
//Tom scored 3