我使用java堆栈数据结构来维护数据。我已将我的堆栈限制为大小50.我想要做的是从一次调用中获取堆栈中的最新5个数据。我认为方法子列表(0,5)会这样做。但不幸的是,方法返回最后5个数据,因为继承自java.util.list的方法有任何方法可以做到这一点。或者是否有其他数据结构满足我的要求。请帮助我。提前谢谢。
P.s我想在我重新开始后在堆栈中保留5个数据。
Stack stack = new Stack();
for(int i=0; i<10;i++){
stack.push(""+i);
}
for(int k= 0 ;k<11;k++){
System.out.println(stack.subList(0,5));
}
输出这个将是{0,1,2,3,4}。但我想得到{9,8,7,6,5}
答案 0 :(得分:3)
默认堆栈实现没有您需要的方法。 你将不得不pop()你的堆栈5次。
所以我建议扩展一个Stack实现或编写一个实用方法,将5个pops分组。
类似的东西:
public static <T> List<T> multiPop( Stack<T> stack, int times)
{
List<T> list = new ArrayList<T>();
for ( int i = 0;i<times;i++)
{
list.add(stack.pop());
}
return list;
}
但需要考虑每个流行音乐的行为
如果您需要多层次
public static <T> List<T> multiPeek( Stack<T> stack, int depth )
{
int len = stack.size();
if ( len < depth )
throw new EmptyStackException();
List<T> list = new ArrayList<T>();
for (int i = 0; i < depth; i++)
{
list.add(stack.elementAt(len-i-1));
}
return list;
}
答案 1 :(得分:2)
如果sublist(0,5)
返回错误的堆栈末尾,请尝试更改索引。不是从0开始,而是从stack.size()-6
开始。
正如其他人所指出,你也可以pop()
5次。在函数式语言中,您正在寻找的操作简称为take 5
。它很容易自己实现,但你必须用Java派生自己的堆栈类。
另一个要点:当你pop()
5次时,这些元素将从堆栈中删除。这可能是也可能不是你想要的。但是,请记住,sublist
将返回一个可能修改堆栈本身的列表,因此您可以轻松地在那里遇到完整性问题。
因此,我建议您编写自己的堆栈类并实现take(n)
方法,该方法执行sublist
调用并将结果复制到新的列表中,这样最终返回的列表不会影响您的原始列表叠加。
答案 2 :(得分:0)
通常如果你有一个实际的堆栈,你会有一个pop方法。堆栈不完全是直接列表。你可以弹出5次,但你需要确保有东西可以从堆栈中取出。