所以我已经设法在堆栈的帮助下实现了反转一个ArrayList(of Strings),但是我无法弄清楚如何用整数来实现它。我得到一个堆空错误,任何想法? 【JAVA]
这是代码:
package Class;
import java.util.ArrayList;
import java.util.Stack;
public class Class
{
static ArrayList<Integer> list = new ArrayList();
static Stack<Integer> stack = new Stack();
public static ArrayList<Integer> reverseList(ArrayList<Integer> n)
{
for(int i = 0; i < n.size(); i++)
{
stack.push(n.get(i));
n.remove(0);
}
for(int i = 0; i != stack.size();)
{
n.add(stack.pop());
}
return n;
}
public static void main(String[] args)
{
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);
ArrayList n = reverseList(list);
System.out.println(n);
}
}
错误是空堆栈错误。
代替
for(int i = 0; i < n.size(); i++)
{
stack.push(n.get(i));
n.remove(0);
}
做这个
for(int i = 0; i < n.size(); i++)
{
stack.push(n.get(i));
}
n.clear();
它应该工作正常。
没有重新发明轮子,你不能只使用:
Collections.reverse(list);
说到问题,这里:
for(int i = 0; i < n.size(); i++)
{
stack.push(n.get(i));
n.remove(0);
}
你总是删除第一个元素,但之后在中间获得一些元素,这会导致丢失一些元素。你应该使用Iterator
。有关详细说明,请查看documentation。
正如已经指出的那样,一个主要问题是这一部分:
for(int i = 0; i < n.size(); i++)
{
stack.push(n.get(i));
n.remove(0);
}
在这里,您始终从列表中删除第一个元素,但获取索引i
中的元素以将其添加到堆栈中。
让我们通过获取1,2,3,4,5的列表来分析:
i = 0
所以你按1并从列表中删除1现在变为2,3,4,5i = 1
所以你按3并删除2,所以现在列表是3,4,5i = 2
所以你按5并删除3.现在列表是4,5并且长度小于i
所以循环停止。问题是:你没有调整i
来适应删除。
正如m.k建议你可以将所有元素添加到堆栈中,然后删除所有元素。
或者使用迭代器:
for( Iterator<Integer> itr = n.iterator(); itr.hasNext(); ) {
stack.push(itr.next()); //this advances the iterator so only call next() once per iteration
itr.remove(); //this removes the element from the list
}
public static ArrayList<Integer> reverseList(ArrayList<Integer> n) {
for(int i = n.size()-1; i >=0; i--) {
stack.push(n.get(i));
}
n.clear();
while (stack.size() !=0)
n.add(stack.pop());
return n;
}
有很多方法可以解决问题,但似乎使用堆栈很重要,所以用上面的代码稍微改变你的方法