在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 "")
这适用于字符串+
运算符和""
。但是::
和列表可以做类似的事情吗?
答案 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
这种方法足以解决任何问题。