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

问题描述 投票:0回答:1

我有两个序列,说:

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")

是否有一种惯用法为第一个序列中的值添加默认值,而第二个序列中的值没有给定的标准?欣赏你的想法。

scala join default-value cartesian-product
1个回答
3
投票

这里有一种方法是使数组second成为Map并使用first查找数组getOrElse中的元素的Map:

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"
© www.soinside.com 2019 - 2024. All rights reserved.