我有一个堆栈A,我想创建一个与堆栈A相同的堆栈B.我不希望堆栈B只是一个指向A的指针 - 我实际上想要创建一个包含A的新堆栈堆栈A的相同元素与堆栈A的顺序相同。堆栈A是一堆字符串。
谢谢!
答案 0 :(得分:25)
只需使用Stack-class的clone()方法(它实现Cloneable)。
这是一个简单的JUnit测试用例:
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Assert.assertEquals(intStack.pop(), copiedStack.pop());
}
}
编辑:
tmsimont:这会为我创建一个“未经检查或不安全的操作”警告。任何 如何做到这一点,而不会产生这个问题?
我起初回应说警告是不可避免的,但实际上可以使用<?>
(通配符)-typing来避免:
@Test
public void test()
{
Stack<Integer> intStack = new Stack<Integer>();
for(int i = 0; i < 100; i++)
{
intStack.push(i);
}
//No warning
Stack<?> copiedStack = (Stack<?>)intStack.clone();
for(int i = 0; i < 100; i++)
{
Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong
Assert.assertEquals(intStack.pop(), value);
}
}
基本上我会说你仍在进行从?
(未知类型)到Integer
的未经检查的演员表,但是没有警告。就个人而言,我仍然希望直接投射到Stack<Integer>
并使用@SuppressWarnings("unchecked")
来抑制警告。
答案 1 :(得分:20)
Stack
扩展了Vector
,因此您可以新建一个新Stack
并使用.addAll(...)
复制这些项目:
Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);
答案 2 :(得分:4)
Stack类是AbstractList的子类。
简单地将其视为AbstractList,使用get(int index)
方法迭代堆栈中的元素,从0到列表/堆栈的长度,并将元素添加到新堆栈。
这不会复制元素 - 它会将元素添加到新堆栈中。如果您还需要复制元素,则需要深入了解其他级别并创建元素的副本,并将这些元素添加到新堆栈中。
您可以使用clone
方法执行full (or "deep") copies,但请注意,该对象必须实现Clonable界面才能获得deep copies of objects。
答案 3 :(得分:0)
您想使用clone方法。
答案 4 :(得分:0)
/**
* Copy constructor for the Stack class
* @param original the Stack to copy
* @postcondition a new Stack object which is
* an identical, but distinct, copy of original
*/
public Stack(Stack<T> original) {
if (original.length == 0)
{
length = 0;
top = null;
} else
{
Node temp = original.top;
while (temp != null)
{
push(temp.data); // inserts into this
temp = temp.next;
}
temp = top;
temp = temp.next;
top.next = null;
while (temp != null){
push(temp.data); // inserts into this
temp = temp.next;
}
}
}
答案 5 :(得分:-1)
/**
* Copy constructor for the Stack class
* @param original the Stack to copy
* @postcondition a new Stack object which is
* an identical, but distinct, copy of original
*/
public Stack(Stack<T> original) {
if (original.length == 0)
{
length = 0;
top = null;
} else
{
Node temp = original.top;
while (temp != null)
{
push(temp.data); // inserts into this
temp = temp.next;
}
temp = top;
temp = temp.next;
top.next = null;
while (temp != null){
push(temp.data); // inserts into this
temp = temp.next;
}
}
}