从可变列表中删除元素

时间:2012-07-20 07:47:38

标签: scala

我想选择一个元素,然后在O(1)时间内从可变列表中删除它。 在C ++中,我可以做到

std::list<Foo> lst;
std::list<Foo>::iterator it = //some choice
//And then, possibly in another function,
lst.erase(it);

我可以在Scala中使用等效的代码,还是必须进行过滤或差异?

编辑:澄清一下,我想分开选择和删除。我想标记一个元素,以便以后可以快速访问,修改和删除它。如果我也可以在选定的元素之后插入另一个元素,那将是很棒的。这是C ++迭代器提供的功能。

2 个答案:

答案 0 :(得分:3)

scala.collection.mutable.ArrayBuffer为例(当然还有其他人,但你没有说出你感兴趣的集合,所以我选了一个):

val a = ArrayBuffer(1, 2, 3, 4)
a -= 3

这与C ++版本的语义相同(但它仍然是O(n),就像C ++版本一样。)

答案 1 :(得分:3)

如果您想要删除O(1),我认为您唯一的选择是搜索相应的内部链接列表(使用next)并保留参考。

如果使用mutable.DoubleLinkedList,事情会变得容易一些:

val li = DoubleLinkedList(1,2,3,4,5,6)
val elem = li.next.next.next // O(< n) until you find what you want
elem.remove() // O(1)

li == DoubleLinkedList(1,2,3,5,6)

但即便如此,你也不会拥有C ++可变迭代器接口的完整镜像。

我不确定是否有适当的Scala列表可以支持类似的东西。另一种建议是使用Zipper,它还为拉链位置的操作提供O(1)。