最有效的方法来反转堆栈并添加到ArrayList

时间:2009-08-07 14:31:59

标签: java data-structures performance stack arraylist

我有两个集合 - 一个ArrayList和一个Stack。我使用堆栈因为我需要一些简单的pop / push功能来代替这段代码。 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中,然后从pop顺序放置。

我的第一个想法是

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

...哪个有效,但我担心在ArrayList的开头添加一个元素的效率(这会强制所有现有元素需要移位..这是一个链表(我相信)..大不了。但仍然是一个问题)。此外,我正在通过循环运行...可能不必要。

所以,我的第二个解决方案没有涉及循环(至少在我的代码中,我确定后端调用正在进行循环)。

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

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

所以,我的问题是:对于SMALL到MEDIUM尺寸的集合中哪一个最有效?如果有一个更有效的解决方案,它会是什么?

5 个答案:

答案 0 :(得分: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的哪些特殊功能? (我不是说你需要它们,只是检查!)

答案 1 :(得分:3)

Stack是Collections和Collections的子类reverse method,所以你可以这样做 -

   Stack originalStack = ...
   Collections.reverse(originalStack);

答案 2 :(得分:2)

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

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

快速,简单,易于查看它正在做什么。

答案 3 :(得分:1)

对ArrayList进行子类化并添加pop和push方法。 使用它作为Stack类。

准备好后,将其分配给Arraylist变量并准备就绪

答案 4 :(得分: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);
}