Списки соответствия шаблонов определенного размера или больше/меньше
Есть ли способ указать шаблон, который соответствует списку с размером больше (или меньше) или равным определенному значению в Scala?
Например, если я хочу применить одно и то же действие ко всем спискам размером 3 или менее:
list match {
case Nil => op(list)
case x :: Nil => op(list)
case x :: y :: Nil => op(list)
case x :: y :: z :: Nil => op(list)
case x :: tail => other(list)
}
Есть ли способ уменьшить это до двух случаев?
Ответы
Ответ 1
Да, хотя вам нужно будет изменить порядок дел:
list match {
case l @ (_ :: _ :: _ :: _) => other(l)
case l => op(l)
}
Обратите внимание, что я привязал новую переменную l
к списку в шаблоне вместо ссылки на list
и что я использовал _
, когда мне не нужна переменная. Я предлагаю придерживаться обеих этих практик, но ответ будет работать точно так же без них.
Ответ 2
Если вы настаиваете на использовании соответствия шаблону (возможно, вы хотите включить больше случаев совпадения?), вы можете использовать состояние защиты для него:
list match {
case l if(l.size <= 3) => op(l)
case l => other(l)
}
Ответ 3
Что не так с простым старым if/else??
if (list.length >= minimumLength)
longer(list)
else
shorter(list)
Ответ 4
Вы также можете сделать это с помощью
list.splitAt(len) match {
case (xs, Nil) => other(xs)
case (_, _) => op(list)
}
Также сложность O(len)
, даже если список длинный, len
является решающим фактором.
Вышеупомянутые вызовы op
, если list.size < len
else вызывает other