我有两个序列,说:
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")
是否有一种惯用法为第一个序列中的值添加默认值,而第二个序列中的值没有给定的标准?欣赏你的想法。
这里有一种方法是使数组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"