【问题标题】:Cartesian product (combinations) with empty Seq具有空 Seq 的笛卡尔积(组合)
【发布时间】:2017-08-10 20:33:41
【问题描述】:

我想要 scala 中三个 Seq 的笛卡尔积(组合)。其中任何一个都可以为空。我知道任何带有空集的集合的笛卡尔积都是空集。我想要一个解决方法来提供一个默认值(下面的例子中的“”)。这是骨架代码。

val letters = Seq("a", "b")
val numbers = Seq("1")
val empty: Seq[String] = Nil
// Desired output = Seq(("a", "1", ""), ("b", "1", ""))

// Cartesian product
// What I'm trying which returns List()
for {
 l <- letters
 n <- numbers
 e <- empty
} yield {
    (l, n, e)
}

到目前为止,我已经尝试过 lift 和 orElse(Seq(""))。 orElse 的问题是它返回一个 PartialFunction,我失去了映射或 flatMap 的能力。

【问题讨论】:

  • e &lt;- if (empty.isEmpty) Seq("") else empty?
  • 谢谢!陷入 orElse 和其他令人困惑的事情

标签: scala scala-collections


【解决方案1】:

如果你的默认值是事先知道的,你可以创建一个包含默认值的单个元素的列表:

def nonEmptyOrDefault[A](xs: Seq[A], default: A): Seq[A] =
  if (xs.isEmpty) Seq(default)
  else xs

for {
  l <- nonEmptyOrDefault(letters, "")
  n <- nonEmptyOrDefault(numbers, "")
  e <- nonEmptyOrDefault(empty, "")
} yield (l, n, e)

或者你可以使用一个确保非空的集合

class NESeq[+A] private (private val xs: Iterable[A]) {
  // TODO implement flatMap, map, ++, etc.
}

object NESeq {
  def fromIterable[A](xs: Iterable[A]): Option[NESeq[A]] =
    if (xs.isEmpty) None
    else Some(new NESeq(xs))
}

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2017-03-31
    相关资源
    最近更新 更多