Scala-条件数组/两个数组的连接,默认值用于理解

时间:2019-04-25 16:31:41

标签: scala join default-value cartesian-product

我有两个序列,说:

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 个答案:

答案 0 :(得分:3)

这是将数组second设置为Map并使用first在Map中查找数组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"