【问题标题】:Reversing an ArrayList of Integers with the aid of a stack借助堆栈反转整数的 ArrayList
【发布时间】:2019-08-05 12:44:20
【问题描述】:

所以我已经设法在堆栈的帮助下实现反转 ArrayList(字符串),但我不知道如何使用整数来实现。我收到一个堆栈空错误,有什么想法吗? [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);
    }
}

错误是空堆栈错误。

【问题讨论】:

  • 反转整数列表不应与反转字符串列表不同。因此,如果您设法做到了后者,那么这应该已经是它了(提示:将String 替换为泛型类型)。如果这不起作用,请向我们展示您为字符串所做的工作。
  • 这是完全相同的代码,但我已将数据类型 String 更改为 Integer - 它不起作用。请不要光顾!
  • 我们能看到整个日志吗?
  • 我不是故意光顾的 :) 但是,正如我所说,如果你让它适用于字符串,那么 exact 相同的代码(只是Integer 而不是 String) 也应该可以工作。如果不是,则有 2 种可能性:1) 代码不同或 2) 字符串版本不能正常工作或至少不符合预期。
  • 代码是一样的,它工作得很好吗?那么还有另一种可能性......而且,这就是整个日志

标签: java string list arraylist java-8


【解决方案1】:

代替

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();

它应该可以正常工作。

【讨论】:

    【解决方案2】:

    如果不重新发明轮子,你就不能使用:

    Collections.reverse(list);
    

    当涉及到问题时,这里:

    for(int i = 0; i < n.size(); i++)
    {
        stack.push(n.get(i));
        n.remove(0);
    }
    

    您总是删除第一个元素,但之后在中间获取一些元素,这会导致丢失一些元素。您应该为此使用Iterator。查看documentation了解详细说明。

    【讨论】:

    • 谢谢,我知道收集功能存在 - 但我正在尝试使用堆栈 - 这是一个项目。那么我该如何改变呢?
    【解决方案3】:

    正如已经指出的,一个主要问题是这部分:

    for(int i = 0; i < n.size(); i++)
    {
      stack.push(n.get(i));
      n.remove(0);
    }
    

    在这里,您总是从列表中删除第一个元素,但获取索引 i 处的元素以将其添加到堆栈中。

    让我们通过列出 1、2、3、4、5 来分析一下:

    • 第 1 步:i = 0,因此您按下 1 并从列表中删除 1,现在变为 2、3、4、5
    • 第 2 步:i = 1 所以你推 3 并删除 2,所以现在的列表是 3、4、5
    • 第 3 步:i = 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
    }
    

    【讨论】:

      【解决方案4】:
      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;
      }
      

      有很多方法可以逆转事情,但似乎使用堆栈对你来说很重要,所以用上面的代码稍微改变你的方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2018-05-09
        • 1970-01-01
        • 2015-06-06
        • 2016-01-03
        • 1970-01-01
        • 2015-04-03
        相关资源
        最近更新 更多