2015-04-29 6 views
2

Добрый день! Я использую Scala, и я хочу сопоставить первые три элемента списка и последний, независимо от того, сколько из них в списке.Последний элемент массива, соответствующий scala

val myList:List[List[Int]] = List(List(3,1,2,3,4),List(23,45,6,7,2),List(3,3,2,1,5,34,43,2),List(8,5,3,34,4,5,3,2),List(3,2,45,56)) 

def parse(lists: List[Int]): List[Int] = lists.toArray match{ 
    case Array(item, site, buyer, _*, date) => List(item, site, buyer, date)} 

myList.map(parse _) 

Но я получаю: error: bad use of _* (a sequence pattern must be the last pattern) Я понимаю, почему я получаю это, но как я могу избежать?

Мое использование - это то, что я читаю из hdfs, и каждый файл имеет точные столбцы N (N является постоянным и равным для всех файлов), поэтому я хочу сопоставить только некоторые из них, не записывая что-то вроде case Array(item1, item2 , ..., itemN) => List(item1, item2, itemK, itemN)

Спасибо!

ответ

3

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

scala> myList match { 
    case item :: site :: buyer :: tail if tail.nonEmpty => 
    item :: site :: buyer :: List(tail.last) 
} 
res3: List[List[Int]] = List(List(3, 1, 2, 3, 4), List(23, 45, 6, 7, 2), 
    List(3, 3, 2, 1, 5, 34, 43, 2), List(3, 2, 45, 56)) 

Или еще более кратким решением было предложено Kolmar

scala> myList match { 
    case item :: site :: buyer :: (_ :+ date) => List(item, site, buyer, date) 
} 
+2

Вы хотите добавить ', если (tail.nonEmpty)', в противном случае это будет соответствовать 'List (1, 2, 3) ', но вызывать' NoSuchElementException', когда вы вызываете 'tail.last'. –

+0

@ m-z Я исправил свой ответ, THX! – ipoteka

+3

Или просто используйте 'myList match { case item :: site :: buyer :: (_: + date) => Список (элемент, сайт, покупатель, дата)}' – Kolmar

Смежные вопросы