我有一个List,它可能包含比较相等的元素 . 我想要一个类似的List,但删除了一个元素 . 所以从(A,B,C,B,D)我希望能够“移除”一个B来获得例如(A,C,B,D) . 结果中元素的顺序无关紧要 .
我有工作代码,在Scala中用Lisp启发的方式编写 . 有没有比较惯用的方法呢?
上下文是一种纸牌游戏,其中有两副标准牌正在进行中,因此可能存在重复的牌但仍然一次只能打一张牌 .
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 回答
我在上面的答案中没有看到这种可能性,所以:
编辑:
喜欢魅力:-) .
您可以使用filterNot方法 .
你可以试试这个:
并作为方法:
不幸的是,集合层次结构在
List
上与-
陷入了混乱 . 对于ArrayBuffer
,它的工作方式与您希望的一样:但是,遗憾的是,
List
结束了filterNot
风格的实现,因此"wrong thing"并向你发出了弃用警告(足够明智,因为它实际上是filterNot
ing):所以可以说最容易做的就是将
List
转换成一个正确执行此操作的集合,然后再转换回来:或者,您可以保留您所拥有的代码的逻辑,但使风格更加惯用:
作为一种可能的解决方案,您可以找到第一个合适元素的索引,然后删除此索引处的元素:
怎么样
如果你看到
return
,那就有问题了 .关于如何使用折叠这样做的另一个想法:
通用尾递归解决方案: