2016-08-17 2 views
0

다음과 같은 배열 데이터가 있습니다 : [("Bob",5),("Andy",10),("Jim",7),...(x,y)].스칼라 - 패턴 내부의 자동 반복기

스칼라에서 패턴 일치를 수행하는 방법은 무엇입니까? 그래서 그들은 (하나 하나 대신 정의 "케이스") 내가 이렇게 해달라고 의미

, 내가 제공 한 배열 데이터에 따라 자동으로 의사 일치합니다 :

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(",")) 

및 각 항목을 통신으로 구분합니다. 에이.


잡록은

우리가 첫 번째 튜플 및 방치 나머지를 추출 할 첫 번째 경우

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

을, 스칼라 Array에 일치하는 패턴을 보여 고려해야 할 지적한다. 첫 번째 튜플에서 문자열 "Bob"과 일치하고 두 번째 항목을 무시합니다. 또한 첫 번째 튜플을 t이라는 태그에 바인딩합니다.이 튜토리얼은 첫 번째 항목을 참조 할 때 인쇄에 사용됩니다.

두 번째 경우는 이고 다른 모든 경우는이 아닙니다.

+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

그냥 배열에있는 모든 데이터를 인쇄 할하지만 경우 질문에 대한 혼란 비트 전 이 작업을 수행 할 것입니다 :

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

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