Scala:简洁有条件地列出清单

时间:2014-06-15 03:46:58

标签: scala cons empty-list

在Scala中有条件地构建列表是否有更简洁的方法?这是我开始的地方:

(j, k) match {
  case (0, 0) => List()
  case (j, 0) => List((c1, j))
  case (0, k) => List((c2, k))
  case (_, _) => List((c1, j), (c2, k))
}

相比之下,我可以用String:

来做到这一点
"" + (if (j > 0) "j-part" else "") + (if (k > 0) "k-part" else "")

这适用于字符串+运算符和""。但是::和列表可以做类似的事情吗?

4 个答案:

答案 0 :(得分:3)

这是一个相当令人满意的解决方案:

List((c1, j), (c2, k)).filter(_._2 > 0)

答案 1 :(得分:1)

此解决方案很有效:

(if (j != 0) List((c1, j)) else List()) :::
(if (k != 0) List((c2, k)) else List())

灵活,具有独立条件,并且能够在结果列表中添加多个元素:

(if (j != 0) List((c1, j)) else List()) :::
(if (k % 2 != 0) List((c3, k + 1), (c2, k)) else List())

但这可能是命令式代码更紧凑和更高效的地方:

var result = List[(Int, Int)]()
if (k != 0) result +:= (c2, k)
if (j != 0) result +:= (c1, j)

答案 2 :(得分:1)

另一种选择,适用于更多元素。

List(
  if (j != 0) List((c1, j)) else Nil,
  if (k != 0) List((c2, k)) else Nil
).flatten

答案 3 :(得分:1)

假设c的集合;例如n=5

c = (1 to n).map { "c" + _ }
Vector(c1, c2, c3, c4, c5)

然后我们可以迭代一个给定的arity元组,例如5,就像这样,

(i,j,k,l,m).productIterator zip Iterator.from(1).map { _ match {
    case (0, idx) => List()
    case (x, idx: Int) => List((c(idx-1), x))
  }
}.toList

这种方法足以解决任何问题。