0

我有两个集合 - 一个 ArrayList 和一个 Stack。我使用堆栈是因为我需要一些简单的弹出/推送功能来处理这段代码。ArrayList 本质上是 out 变量,因为这是函数中的一小段代码。

因此,变量是这样定义的,然后运行代码以将元素添加到堆栈中。

ArrayList<String> out = new ArrayList<String>();

/* other code.. */

Stack<String> lineStack = new Stack<String>();

/* code that adds stuff to the stack */

问题是,既然我有一个完全填充的堆栈,我如何将它以与弹出顺序相反的顺序放置在 out ArrayList 中。

我第一个想到的解决方案是

 while(!lineStack.empty()) {
     out.add(0, lineStack.pop());
 }

...这行得通,但是我担心将元素添加到 ArrayList 开头的效率(这会迫使所有现有元素都需要移动..这是一个链表(我相信)..很重要..但仍然关注)。此外,我正在通过一个循环运行它......也许是不必要的。

所以,我的第二个不涉及循环的解决方案(至少在我的代码中,我确信后端调用正在这样做)。

 List l = lineStack.subList(0, lineStack.size());
 out.addAll(l);

我知道我不需要分配列表,但它会保留更清晰的代码。但是,我不确定这是否会给我带来特别有用的性能提升。

所以,我的问题是:对于小到中尺寸的套装,哪一个可能最有效?如果有更有效的解决方案,它会是什么?

4

5 回答 5

23

Iterable<T>实现顺序Stack<T>无论如何都按照你想要的顺序进行,所以你可以使用

new ArrayList<String>(stack);

这是一个简短但完整的示例:

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        Stack<String> stack = new Stack<String>();
        stack.push("Bottom");
        stack.push("Middle");
        stack.push("Top");

        List<String> list = new ArrayList<String>(stack);

        for (String x : list)
        {
            System.out.println(x);
        }
    }
}

这打印出来:

Bottom
Middle
Top

(这与弹出它们时得到的顺序相反)。

编辑:另一个问题 - 你真的需要它ArrayList<String>吗?Stack<T>实现List<T>;你需要什么特殊功能ArrayList?(我不是说你不需要它们,只是检查一下!)

于 2009-08-07T14:38:24.707 回答
3

Stack is subclass of Collections and Collections has reverse method, So you can just do -

   Stack originalStack = ...
   Collections.reverse(originalStack);
于 2016-03-03T13:02:14.567 回答
2

如果您不需要它作为数组,但另一个堆栈可以工作,为什么不:

Stack<String> reversedStack = new Stack<String>(); while (!oldStack.empty()) { reversedStack.push(oldStack.pop()); }

快速、简单且易于查看它在做什么。

于 2014-04-23T17:51:23.413 回答
1

子类化 ArrayList 并添加一个 pop 和 push 方法。将其用作 Stack 类。

准备好后,将其分配给 Arraylist 变量即可

于 2009-08-07T14:38:04.177 回答
0

使用 Stack.toArray 很简单:

@Test
public void stackToList() {
    Stack<String> stack = new Stack<String>();
    stack.push("aaa");
    stack.push("bbb");
    stack.push("ccc");
    List<String> list=  Arrays.asList(stack.toArray(new String[0]));
    Assert.assertEquals(Arrays.asList("aaa", "bbb", "ccc"), list);
}
于 2009-08-07T14:42:35.340 回答