java - IntelliJ 调试器认为我的 Stack 实际上比它小一个元素?
问题描述
我试图在不修改原始堆栈的情况下计算堆栈中所有元素的总和。为此,我将项目从原件中弹出并将它们推入新堆栈,以便保留未修改的副本。当项目被弹出/推送时,我通过查看新堆栈的顶部来添加总和。
这工作正常,但在测试方法时,堆栈大小有一个非常令人困惑的问题。
这是我的代码:
public static void main(String[] args) {
Stack<Integer> myStack = new Stack<>();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
System.out.println("Stack size = " + myStack.size());
System.out.println(stackSum(myStack));
}
private static int stackSum(Stack<Integer> stack) {
int sum = 0;
Stack<Integer> newStack = new Stack<>();
if (!stack.isEmpty()) {
for (int i = 0; i <= stack.size(); i++) {
newStack.push(stack.pop());
sum += newStack.peek();
}
}
return sum;
}
我得到的答案是 12 而不是 15,这是因为 IntelliJ 认为传递给 stackSum() 方法的堆栈长度是 4 而不是 5。这是一张图片:
SOUT 清楚地说大小是 5,但调试器认为它是 4?!
非常感谢您对了解这里发生的事情的帮助。谢谢!
编辑:
private static int stackSum(Stack<Integer> stack) {
int sum = 0;
int n = stack.size();
Stack<Integer> newStack = new Stack<>();
if (!stack.isEmpty()) {
for (int i = 0; i < n; i++) {
newStack.push(stack.pop());
sum += newStack.peek();
}
}
return sum;
}
这符合我的预期。作为规范的一部分,我必须保留堆栈的副本。现在很好,谢谢。
解决方案
调试器指出size = 4
,因为您已经执行了stack.pop
从堆栈中删除一个元素的调用,因此它的大小现在为 4。
您应该删除if
并for
用 a 替换它,while(!stack.isEmpty())
并且也可能消除newStack
:
while (!stack.isEmpty()) {
sum += stack.pop();
}
推荐阅读
- variables - 在 Puppet 中,如何在 if 子句中使用定义的节点变量
- python - 如何读取 n 个变量中的 n 个文件,然后将这些变量添加到列表中?
- angular - 如何通过特殊关键字自动拆分标签?
- javascript - 在 appscript 中发布对外部 api 的请求
- objective-c - Objective-C:如何正确设置 TabBarController 的 didSelectViewController 方法,这样我每次点击时都可以刷新 VC
- r - dbwritetable 从多个 R studio 会话同时到同一个 SQL 表
- javascript - 未按预期克隆
- javascript - React Js 中渲染子菜单组件的问题
- dpdk - 如何将 DPDK 应用程序编译为库
- python - 为不同对象上的多个位置实例绘制 XY 位置