Подтвердить что ты не робот

Как мне сопоставить массивы совпадений в Scala?

Определение моего метода выглядит следующим образом

def processLine(tokens: Array[String]) = tokens match { // ...

Предположим, что я хочу знать, свободна ли вторая строка

case "" == tokens(1) => println("empty")

Не компилируется. Как мне это сделать?

4b9b3361

Ответ 1

Если вы хотите сопоставить шаблон в массиве, чтобы определить, является ли второй элемент пустой строкой, вы можете сделать следующее:

def processLine(tokens: Array[String]) = tokens match {
  case Array(_, "", _*) => "second is empty"
  case _ => "default"
}

_* связывается с любым количеством элементов, включая none. Это похоже на следующее совпадение в списках, которое, вероятно, лучше известно:

def processLine(tokens: List[String]) = tokens match {
  case _ :: "" :: _ => "second is empty"
  case _ => "default"
}

Ответ 2

Совпадение шаблонов не может быть правильным выбором для вашего примера. Вы можете просто сделать:

if( tokens(1) == "" ) {
  println("empty")
}

Согласование шаблонов более подходит для таких случаев, как:

for( t <- tokens ) t match {
   case "" => println( "Empty" )
   case s => println( "Value: " + s )
}

которые печатают что-то для каждого токена.

Изменить:, если вы хотите проверить, существует ли какой-либо токен, который является пустой строкой, вы также можете попробовать:

if( tokens.exists( _ == "" ) ) {
  println("Found empty token")
}

Ответ 3

Оператор

case не работает. Это должно быть:

case _ if "" == tokens(1) => println("empty")

Ответ 4

Что особенно круто, так это то, что вы можете использовать псевдоним для материала, сопоставляемого _* с чем-то вроде

val lines: List[String] = List("Alice Bob Carol", "Bob Carol", "Carol Diane Alice")

lines foreach { line =>
  line split "\\s+" match {
    case Array(userName, [email protected]_*) => { /* Process user and his friends */ }
  }
}