Что такое идиоматический способ Scala «удалить» один элемент из неизменяемого Списка? - PullRequest
74 голосов
/ 12 апреля 2011

У меня есть список, который может содержать элементы, которые будут сравниваться как равные. Я хотел бы подобный Список, но с одним удаленным элементом. Итак, из (A, B, C, B, D) я хотел бы иметь возможность «удалить» только один B, чтобы получить, например. (A, C, B, D). Порядок элементов в результате не имеет значения.

У меня есть рабочий код, написанный на языке Lisp в Scala. Есть ли более идиоматический способ сделать это?

Контекст представляет собой карточную игру, в которой используются две колоды стандартных карт, поэтому быть дубликатами карт, но по-прежнему разыгрываться по одной.

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)
}

Ответы [ 12 ]

0 голосов
/ 10 сентября 2014
val list : Array[Int] = Array(6, 5, 3, 1, 8, 7, 2)
val test2 = list.splitAt(list.length / 2)._2
val res = test2.patch(1, Nil, 1)
0 голосов
/ 13 мая 2013

Еще одна мысль о том, как сделать это с помощью сгиба:

def remove[A](item : A, lst : List[A]) : List[A] = {
    lst.:\[List[A]](Nil)((lst, lstItem) => 
       if (lstItem == item) lst else lstItem::lst )
}
...