我正在使用java.util.Stack
,但我错过了一个 multipop
stack.pop(10);
这应该给我一个列表,其中包含 10 个(或更少是堆栈不包含足够的)堆栈中的项目(并将它们从堆栈中删除)。java中是否有任何标准类?还是让我自己实施?
没有multipop
方法。您可以扩展 Stack 以添加您自己的功能。
public class ImprovedStack<E> extends Stack<E> {
public synchronized E[] pop(int count) {
E[] objs = new E[count];
for (int i = 0; i < count; i++) {
objs[i] = pop();
}
return objs;
}
}
使用此实现,如果堆栈中的对象少于 ,则会引发 EmptyStackException count
,但您可以根据需要对其进行修改。
在Eclipse Collections中,有一个Stack
名为的替代实现ArrayStack
恰好提供了这种类型的行为。
MutableStack<String> stack =
Stacks.mutable.with("j", "i", "h", "g", "f", "e", "d", "c", "b", "a");
ListIterable<String> result = stack.pop(2);
Assert.assertEquals(Lists.mutable.with("a", "b"), result);
ArrayList<String> arrayList = stack.pop(4, new ArrayList<>());
Assert.assertEquals(Arrays.asList("c", "d", "e", "f"), arrayList);
Assert.assertEquals(Stacks.mutable.withReversed("g", "h", "i", "j"), stack);
MutableBag<String> bag = stack.pop(4, Bags.mutable.empty());
Assert.assertEquals(Bags.mutable.with("g", "h", "i", "j"), bag);
Assert.assertTrue(stack.isEmpty());
通过 peek(int) 还支持多视图。
注意:我是 Eclipse Collections 的提交者。
不要认为在 Java 中有任何标准的实现。看看这个相关的问题。(我认为这里的答案非常简洁)
您可以使用NavigableSet将数据保持在您喜欢的顺序(为此使用自定义比较器)并允许您查询耳机、子集或尾部。