2011-02-23 5 views
1

문자열 배열이 있습니다. 각 문자열은 두 부분으로 구성되며 공백으로 구분됩니다. 내가알려진 형식의 문자열 목록을 튜플 목록에 어떻게 매핑합니까?

가 어떻게 스칼라에서이 쓸 수있는 각 튜플 (X, Y)가 튜플의 배열로 돌려 원하는

x <white space> y 

: 것 같은데? 나는 비슷한이 필요합니다 알고

val results = listOfStrings.collect { str => (str.left, str.right) } 

하지 ... 내가 필요로 왼쪽과 오른쪽에 각각의 캐릭터 라인을 분리 할 수 ​​있습니다 방법을 잘

답변

3

당신은 (당신이 불평없이 드롭 할 것으로 가정 할 수 패턴에 맞지 않는 문자열) :

val results = listOfStrings.map(_.split("\\s+")).collect { case Array(l,r) => (l,r) } 
+0

이 지금까지 메신저 관련,이 마법으로 – aaaaaaaaaaaab

+0

는'잠재적 인 런타임 절감 view'을 포함 ... 정규식은 당신이 필요로 정확히 일치 있는지 확실하지 않습니다. – Raphael

+0

@Raphael -'listOfStrings'와'map' 사이에서, 네, 잠재적으로. 그러나 나는'split'이 정규 표현식, 배열, 적어도 하나의 문자열을 생성한다는 점에서 눈에 띄는 것이 아닐 것이라고 생각합니다. 하나의 여분의'::'객체가 그다지 의미가 없을 것입니다. –

6

당신은 스칼라에서, 정규 표현식은 또한 "extractors"는 사실을 활용할 수 있습니다. 당신을 위해

scala> Array("a b", "1 3", "Z x").map{case PairWithSpaces(x,y) => (x, y) } 
res10: Array[(String, String)] = Array((a,b), (1,3), (Z,x)) 

는 아마도 과잉하지만 정규식 공상 얻는 경우에 정말로 가독성을 도움이 될 수 있습니다

scala> var PairWithSpaces = "(\\w+)\\s+(\\w+)".r        
PairWithSpaces: scala.util.matching.Regex = (.+)\s+(.+) 

scala> val PairWithSpaces(l, r) = "1  17" 
l: String = 1  
r: String = 17 

이제 자연스러운 "지도"로 추출을 구축 할 수 있습니다. 나는 또한이 방법이 불법 문자열이 주어지면 빨리 실패 할 것 같은데.

경고,

관련 문제