Scala - 两个具有默认值的数组的条件 product/join 用于理解
Scala - conditional product/join of two arrays with default values using for comprehensions
我有两个序列,比如说:
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 并使用 getOrElse
在 Map 中查找数组 first
中的元素:
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"
我有两个序列,比如说:
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 并使用 getOrElse
在 Map 中查找数组 first
中的元素:
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"