0

有没有更简洁的方法在 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))
}

相比之下,我可以用一个字符串来做到这一点:

"" + (if (j > 0) "j-part" else "") + (if (k > 0) "k-part" else "")

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

4

4 回答 4

3

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

List((c1, j), (c2, k)).filter(_._2 > 0)
于 2014-06-15T03:46:57.583 回答
1

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

List(
  if (j != 0) List((c1, j)) else Nil,
  if (k != 0) List((c2, k)) else Nil
).flatten
于 2014-06-15T11:27:44.360 回答
1

假设集合c's; 例如对于n=5,

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

然后我们可以遍历一个给定的元组,例如 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

这种方法足够通用,可以解决任何问题。

于 2014-06-15T14:19:32.877 回答
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)
于 2014-06-15T06:20:30.783 回答