1

我做了一个方法来删除堆栈中的任何重复项并返回按升序排序的结果堆栈。比如看main函数,应该输出为1、3、4、7,但是输出的是原来的栈数据,这是不正确的。有什么建议么?

import java.util.ListIterator;
import java.util.Stack;

public class removeDoubleInStack {
    public static Stack<Integer> removeDouble(Stack<Integer> s) {
        Stack<Integer> tempStack = new Stack<Integer>();

        ListIterator<Integer> iter = s.listIterator();
        while(iter.hasNext()) {
            int tempNext = iter.next();
            if(tempNext != iter.next())
                tempStack.add(tempNext);        
        }
        return tempStack;
    }

    public static void main(String[] args) {
        Stack<Integer> s = new Stack<Integer>();
        s.add(1);
        s.add(3);
        s.add(3);
        s.add(4);
        s.add(7);
        s.add(7);

        removeDouble(s);
        System.out.println(s);
    }
}
4

2 回答 2

1

System.out.println(s) 只打印之前初始化的 s 对象。removeDouble(s) 没有任何影响,除非您创建新的 Stack 对象或重新初始化...

public static void main(String[] args){

    Stack<Integer> s = new Stack<Integer>();
    s.add(1);
    s.add(3);
    s.add(3);
    s.add(4);
    s.add(7);
    s.add(7);

    Stack<Integer> tempStack = removeDouble(s); // create new object
    System.out.println(tempStack);
}

    
于 2013-06-23T14:00:02.380 回答
1

正如您在文档中看到的那样,没有什么类似于删除重复项

https://docs.oracle.com/javase/6/docs/api/java/util/Stack.html

但你可以在以下情况下这样做:

1-获取堆栈的元素作为枚举

2-将枚举转换为列表

3-将列表添加到设置

4-清除堆栈

5-将集合添加到堆栈

例子:

    final Stack<Integer> ms = new Stack<Integer>();
    ms.add(0);
    ms.add(0);
    ms.add(0);
    ms.add(1);
    ms.add(1);
    ms.add(1);
    ms.add(3);
    ms.add(56);
    System.out.println("Before clean:\n" + ms);
    final Set<Integer> s = new HashSet<Integer>(Collections.list(ms.elements()));
    ms.clear();
    ms.addAll(s);
    System.out.println("After clean:\n" + ms);
于 2016-07-05T10:14:42.550 回答