Как бы я отобразить список строк с известным форматом в список кортежей? - PullRequest
1 голос
/ 23 февраля 2011

У меня есть массив строк. Каждая строка состоит из 2 частей и разделена пробелом. Похоже:

 x <white space> y

Я хочу превратить его в массив кортежей, в котором каждый кортеж имеет (x, y)

Как я могу написать это в Scala? Я знаю, что нужно что-то похожее на:

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

не уверен, как я могу разбить каждую улицу на левую и правую стороны, необходимые ...

Ответы [ 2 ]

6 голосов
/ 23 февраля 2011

Вы можете воспользоваться тем, что в Scala Регулярные выражения также являются " extractors ".

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

Теперь вы можете встроить свой экстрактор в естественно выглядящую "карту":

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

Возможно, это излишне для вас, но может действительно помочь читаемости, если ваше регулярное выражение станет интересным.Мне также нравится, как этот подход быстро провалится, если задана недопустимая строка.

Предупреждение, не уверен, что регулярное выражение соответствует именно тому, что вам нужно ...

3 голосов
/ 23 февраля 2011

Вы можете (при условии, что вы хотите без всяких жалоб отбросить любую строку, которая не соответствует шаблону):

val results = listOfStrings.map(_.split("\\s+")).collect { case Array(l,r) => (l,r) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...