【问题标题】:Java - How to initialize stack use another existing stack?Java - 如何使用另一个现有堆栈初始化堆栈?
【发布时间】:2017-03-29 00:28:48
【问题描述】:

我已经在使用Stack 什么使用TOKEN 的类类型,现在我想首先使用堆栈创建和初始化新的Stack。

首先我觉得C#的代码,比如

Stack<Token> e_infixTokens = new Stack<Token>(infixTokens);

C# 的 Stack 构造函数使用另一个堆栈作为参数,但我认为 JAVA 没有。我说的对吗?

所以,这是我的代码的开始部分,

private Stack<Token> infixTokens;
private Stack<Token> postfixTokens;

Formula(String formula){
    this.formula = formula;
    this.infixTokens = new Stack<>();
    this.postfixTokens = new Stack<>();

下面几行,我用这个语句。

Stack<Token> e_infixTokens = new Stack<>(infixTokens);

发生错误。错误信息是:

Stack中的Stack()不能应用于Java.util.Stack

【问题讨论】:

  • 不完全清楚你在找什么。是否希望新堆栈 (e_infixTokens) 与 Stack 与 infixTokens 相同?或者您想创建一个新的Stack,它是infixTokens 的副本?对于非 C# 用户来说,一些澄清会很好。
  • 尝试阅读您正在使用的类的 javadoc。您在那里获得了所有可用 ctor 和方法的列表。

标签: java android stack


【解决方案1】:

一个简单的方法是这样的。

Stack<String> stackCopy = (Stack<String>) stack1.clone();

这个方法来自java.util.Vector.clone(),所以它可能是一个快速的实现。

另外一个是这样的,测试后很慢。

Stack<String> stackCopy = new Stack<String>();
for (String string : stack) {
    stackCopy2.add(string);
}

下面的 sn-p 比较了两种方法通过另一个现有堆栈来初始化堆栈的性能。

public static void main(String[] args) throws Exception {

    Stack<String> stack = new Stack<String>();
    for (int i = 0; i < 1000; i++) {
        stack.push("" + i);
    }


    {
        Stack<String> stackCopy = null;
        long time = System.currentTimeMillis();
        final int numIterations = 100000;
        for (int i = 0; i < numIterations; i++) {
            stackCopy = (Stack<String>) stack.clone();
        }
        System.out.println("stackCopy.get(0) 1 = " + stackCopy.get(0));

        long millis = System.currentTimeMillis() - time;
        System.out.println("Time taken for this: "
                + (millis > 100000 ? (millis / 1000) + " seconds." : millis + " milliseconds."));
    }
    {
        Stack<String> stackCopy = null;
        long time = System.currentTimeMillis();
        final int numIterations = 100000;
        for (int i = 0; i < numIterations; i++) {
            stackCopy = new Stack<String>();
            for (String string : stack) {
                stackCopy.add(string);
            }
        }
        System.out.println("stackCopy.get(0) 2 = " + stackCopy.get(0));

        long millis = System.currentTimeMillis() - time;
        System.out.println("Time taken for this: "
                + (millis > 100000 ? (millis / 1000) + " seconds." : millis + " milliseconds."));
    }
}

控制台结果如下:

stackCopy.get(0) 1 = 0
Time taken for this: 70 milliseconds.
stackCopy.get(0) 2 = 0
Time taken for this: 4098 milliseconds.

另外,第二种方法调用'add'和调用'push'的速度差不多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 2016-04-18
    • 1970-01-01
    • 2011-10-05
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多