1. ホーム
  2. list

[解決済み] イミュータブルリストから1つの要素を「削除」するScalaのイディオム的な方法は何ですか?

2023-03-08 10:28:45

質問

等しいと比較される要素を含むリストがあります。同じようなリストが欲しいのですが、1 つの要素を削除する必要があります。つまり、(A, B, C, B, D) から 1 つの B を削除して、たとえば (A, C, B, D) を得ることができるようにしたいのです。結果における要素の順序は重要ではありません。

私はScalaでLispにインスパイアされた方法で書かれた、作業コードを持っています。これを行うより慣用的な方法 があるのでしょうか?

コンテキストは、標準的なカードの2つのデッキがプレイされているカードゲームで、したがって、重複するカードがあるかもしれません。 重複するカードがあっても、一度に1枚ずつプレイされます。

def removeOne(c: Card, left: List[Card], right: List[Card]): List[Card] = {
  if (Nil == right) {
    return left
  }
  if (c == right.head) {
    return left ::: right.tail
  }
  return removeOne(c, right.head :: left, right.tail)
}

def removeCard(c: Card, cards: List[Card]): List[Card] = {
  return removeOne(c, Nil, cards)
}

どのように解決するのですか?

上記の回答でこの可能性は見当たりませんでしたので。

scala> def remove(num: Int, list: List[Int]) = list diff List(num)
remove: (num: Int,list: List[Int])List[Int]

scala> remove(2,List(1,2,3,4,5))
res2: List[Int] = List(1, 3, 4, 5)

編集する

scala> remove(2,List(2,2,2))
res0: List[Int] = List(2, 2)

お守りのように :-).