Scala - условный продукт / объединение двух массивов со значениями по умолчанию, используемыми для понимания - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть две последовательности, скажем:

val first = Array("B", "L", "T")      
val second = Array("T70", "B25", "B80", "A50", "M100", "B50")   

Как получить продукт таким образом, что элементы первого массива объединяются с каждым элементом второго массива, который начинается с первого, а также дают значение по умолчаниюпустой результат, когда ни один элемент во втором массиве не удовлетворяет условию.

Эффективно, чтобы получить вывод:

expectedProductArray = Array("B-B25", "B-B80", "B-B50", "L-Default", "T-T70")

Я пытался сделать,

  val myProductArray: Array[String] = for {
    f <- first
    s <- second if s.startsWith(f)
  } yield s"""$f-$s"""

, и я получаю:

myProductArray = Array("B-B25", "B-B80", "B-B50", "T-T70")

Существует ли идиоматический способ добавления значения по умолчанию для значений в первой последовательности, не имеющих соответствующего значения во второй последовательности с заданными критериями?Цените свои мысли.

1 Ответ

3 голосов
/ 25 апреля 2019

Вот один из подходов: сделать массив second a Map и найти на карте элементы в массиве first с помощью getOrElse:

val first = Array("B", "L", "T")      
val second = Array("T70", "B25", "B80", "A50", "M100", "B50")  

val m = second.groupBy(_(0).toString)
// m: scala.collection.immutable.Map[String,Array[String]] =
//   Map(M -> Array(M100), A -> Array(A50), B -> Array(B25, B80, B50), T -> Array(T70))

first.flatMap(x => m.getOrElse(x, Array("Default")).map(x + "-" + _))
// res1: Array[String] = Array(B-B25, B-B80, B-B50, L-Default, T-T70)

В случае, если вы предпочитаете использовать for-comprehension:

for {
  x <- first
  y <- m.getOrElse(x, Array("Default"))
} yield s"$x-$y"
...