Я новичок в Scala.
У меня есть функция, которая принимает строку и на основе другой логики мне нужно создать Seq of String со всеми перестановками.
Пример - входная строка 00US_India0234
. Результат будет Seq
из:
US // Condition - if string contains "US"
India // Condition - if string contains "India"
234 // Condition - if string contains number and trim
US_India // One more condition to keep countries intact and so on
Код пытался до сих пор, что я не работал
val retSeq: Seq[String] = Seq.empty
if myStr contains "US" retSeq +: "US"
У меня есть условия, но добавление в Seq невозможно, и я не хочу создавать var
.
Я новичок и не мог найти, с чего начать. Я не хочу создавать несколько Seq
Вы хотите это? input: 00US_India0234
-> output: Seq(Us, India, 0234, US_India)
?
да. И это будет основано на некоторых условиях и без использования mutable
Вы можете создать список кортежей, содержащих предикаты и функции для обработки вашего ввода, который вы хотите потенциально применить, и добавить к Seq
:
val numberRegex = "([0-9]{4,})".r
val predicates = List[(String => Boolean, String => String)](
(s => s.contains("US"), _ => "US"),
(s => s.contains("India"), s => s.toUpperCase()),
(s => numberRegex.findFirstIn(s).nonEmpty, s => numberRegex.findFirstIn(s).head)
)
И тогда вам нужно просто создать метод для создания Seq
:
def process(s: String): Seq[String] = predicates.collect{
case (predicate, value) if predicate(s) => value(s)
}
process("00US_India0234") //List(US, 00US_INDIA0234, 0234)
Как будет выглядеть условие, если вместо константной строки я хочу вызвать функцию? Я пробовал (s => s.contains("US"), trim(s)) но не работает
Вероятно, вам потребуется изменить тип списка. Можете ли вы отредактировать свой вопрос с примером? Это было бы намного проще.
(s => s.matches(".*\\d+.*"), "0234") должен возвращать число, а не жестко заданную строку
Вот еще одна версия с использованием RegEx
:
import scala.util.matching.Regex
val input = "00US_India0234"
val reg = "([A-Z]{2})_?([A-Za-z]+)([0-9]+)".r
val a = for (m <- reg.findAllMatchIn(input)) yield m.subgroups
println(a.toVector.flatten)
// Out: Vector(US, India, 0234)
Вы можете проверить это в скалярия
Я не ищу регулярное выражение, так как у меня будет несколько условий, которые могут быть недостижимы. Но спасибо за еще один вариант
Не могли бы вы опубликовать код, который вы пробовали?