Scala 从可变列表中删除元素

Scala 从可变列表中删除元素,scala,Scala,我想选择一个元素,然后在O(1)时间内将其从可变列表中删除。 在C++中我可以做< /P> std::list<Foo> lst; std::list<Foo>::iterator it = //some choice //And then, possibly in another function, lst.erase(it); std::list lst; std::list::iterator it=//一些选择 //然后,可能在另一个函数中, 1.删除(它);

我想选择一个元素,然后在O(1)时间内将其从可变列表中删除。 在C++中我可以做< /P>
std::list<Foo> lst;
std::list<Foo>::iterator it = //some choice
//And then, possibly in another function,
lst.erase(it);
std::list lst;
std::list::iterator it=//一些选择
//然后,可能在另一个函数中,
1.删除(它);
我可以在Scala中使用等价的代码,还是必须使用filter或diff


编辑:为了澄清,我想把选择和删除分开。我想标记一个元素,以便以后可以快速访问、修改和删除它。如果我能在所选元素之后插入另一个元素,那就太好了。这是C++迭代器给出的功能。

查看<代码> Scala。Cyto.可更改的.例如ArrayBuffer < /C> >(当然还有其他的,但您没有说您感兴趣的集合,所以我只选了一个):


<>这是与C++版本相同的语义(但它仍然是O(n),就像C++版本一样).< /p> 查看<代码> Scala .Cube。ArrayBuffer。<代码>(当然还有其他的,但是你没有说你感兴趣的集合,所以我只选了一个):

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

< P>如果你想做O(1)删除,我想你唯一的选择是搜索相应的内部链表(用<代码> NeX/COD>),并保持引用。 如果使用
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)
val li=DoubleLinkedList(1,2,3,4,5,6)
val elem=li.next.next.next//O(
但即使这样,您也不会有C++可变迭代器接口的完整镜像

我不确定是否有一个合适的Scala列表支持这样的东西。另一种建议是使用a,它也为拉链位置的操作提供O(1)。

如果您想进行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)
val li=DoubleLinkedList(1,2,3,4,5,6)
val elem=li.next.next.next//O(
但即使这样,您也不会有C++可变迭代器接口的完整镜像


我不确定是否有一个合适的Scala列表支持这样的东西。另一个建议是使用A(O)(1)来操作拉链的位置。

C++方法不是O(1),它是O(n)。移除物品的行为是持续的,但发现它是O(n)。@DerekWyatt说得对。我只是指删除。为什么不亲自探索一下一些
可变列表的scaladoc呢?@xiefei,我当然去了。我发现Scala迭代器不能做到这一点。ArrayBuffer有remove(索引),但这不是O(1),更重要的是,删除一个元素可能会使其他索引无效。LinkedList似乎根本没有任何删除功能,虽然我可以让它与next一起工作,但我认为这不是一个好主意。我不能使用Set,因为我可能有重复的。除非有一个多集,我没有注意到。C++方法不是O(1),它是O(n)。移除物品的行为是持续的,但发现它是O(n)。@DerekWyatt说得对。我只是指删除。为什么不亲自探索一下一些
可变列表的scaladoc呢?@xiefei,我当然去了。我发现Scala迭代器不能做到这一点。ArrayBuffer有remove(索引),但这不是O(1),更重要的是,删除一个元素可能会使其他索引无效。LinkedList似乎根本没有任何删除功能,虽然我可以让它与next一起工作,但我认为这不是一个好主意。我不能使用Set,因为我可能有重复的。除非有一个我没有注意到的多重集。
a-=3
似乎不是一个统一的方法。考虑<代码> ArrayBuffer(3, 1, 2,3, 4)< /代码>,不能删除第二代码> 3代码>代码> <代码> -> <代码>。我不知道在这个上下文中“统一”意味着什么。如果要同时删除这三个,请使用
filter
。如果你想删除第二个三(假设你知道还有第二个),那么你必须先找到它。。。上面的解决方案与C++版本相吻合,这就是问题所在。我可以收集任何包含重复的内容。虽然最好是保留顺序的。您能告诉我如何从可变列表中删除元素吗
a-=3
似乎不是一种统一的方法。考虑<代码> ArrayBuffer(3, 1, 2,3, 4)< /代码>,不能删除第二代码> 3代码>代码> <代码> -> <代码>。我不知道在这个上下文中“统一”意味着什么。如果要同时删除这三个,请使用
filter
。如果你想删除第二个三(假设你知道还有第二个),那么你必须先找到它。。。上面的解决方案与C++版本相吻合,这就是问题所在。我可以收集任何包含重复的内容。虽然最好是保留顺序的。您能告诉我如何从可变列表中删除元素吗