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

かなり満足のいく解決策の1つを次に示します。

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

このソリューションは効率的です。

(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 に答える
1

のコレクションを想定しcます。たとえば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 に答える