是否有一种方法与remove
类中的Java ArrayStack
相同?
或者是否可以在Scala中编写一个?
答案 0 :(得分:1)
您可以使用filterNot(_ == o)
创建另一个堆栈,其中缺少o
的任何实例(至少在2.9中),您可以stack.slice(0,n) ++ stack.slice(n+1,stack.length)
创建一个索引元素丢失的新堆栈
但是,不,没有一个确切的类比,可能是因为删除数组中随机位置的项目是一个低性能的事情。
编辑:slice
对我来说似乎有些错误,实际上,在2.9.0.RC2中(我已经提交了一个错误报告,其中包含修复它的代码,所以这将修复为2.9.0.final,大概是) 。在2.8.1中,您必须手动创建一个新的ArrayStack
。所以我想现在的答案非常强调“不”。
编辑:slice
已修复,因此从2.9.0.RC4及更高版本开始,切片方法应该有效。
答案 1 :(得分:1)
所有Scala的集合类型都支持在开始或结束时添加/删除元素(具有不同的性能权衡),并且仅受JVM的某些属性(例如指针的最大大小)的限制。 / p>
因此,如果这是您使用Stack
的唯一原因,那么您选择了错误的集合类型。鉴于要求能够从集合的中间删除元素,像Vector
这样的东西会更好 。
答案 2 :(得分:0)
也许这可以满足您的需求:
scala> import collection.mutable.Stack
import collection.mutable.Stack
scala> val s = new Stack[Int]
s: scala.collection.mutable.Stack[Int] = Stack()
scala> s push 1
res0: s.type = Stack(1)
scala> s push 2
res1: s.type = Stack(2, 1)
scala> s push 3
res2: s.type = Stack(3, 2, 1)
scala> s pop
res3: Int = 3
scala> s pop
res4: Int = 2
scala> s pop
res5: Int = 1
或者还有Stack类的不可变版本。