这是我原来的代码。
Stack<Character> var = new Stack<Character>();
... add elements to stack...
for(ListIterator<Character> i = var.listIterator(); i.hasNext();){
if(i.next() == '*'){
i.remove();
i.previous();
i.remove();
}
}
这里,我意识到应该使用Queue,所以我将第一行改为
Queue<Character> var = new LinkedList<Character>();
但是,我发现Collection没有ListIterator。
为什么只有Vector有ListIterator方法?那么如果把Stack改成Queue,for循环中的五行是不是也要改呢?
最佳答案
旧的Stack
类是 List
,这就是为什么您可以调用 listIterator()
.
现在看来您想使用 Queue
API,但它没有 ListIterator
,或任何其他类型的允许您向后行走的迭代器。
所以你有两个选择:
将
var
变量更改为LinkedList
类型,因为它既是Queue
和一个List
同时,这意味着您可以获得两个 API。LinkedList
是唯一实现两者的内置类。
由于您的逻辑只需要向后查找/删除,因此您可以将逻辑更改为向后迭代,而不是当前的向前迭代,然后向后移动以删除前一个元素的逻辑。
Deque
API 是Queue
的扩展API,用于使用“双端队列”。双端队列可以使用descendingIterator()
向后迭代方法。Deque
的优势最主要的是有4个内置的实现,给你更多的选择:LinkedList
,ArrayDeque
,ConcurrentLinkedDeque
,LinkedBlockingDeque
.
如果您选择选项 2,您的代码将如下所示:
Deque<Character> var = new LinkedList<>();
// add elements to queue
var.addAll(Arrays.asList('A', 'B', '*', 'C', 'D', '*', 'E'));
// remove '*' elements and immediately preceding element
for (Iterator<Character> i = var.descendingIterator(); i.hasNext(); ) {
if (i.next() == '*') {
i.remove();
i.next(); // next() when descending actually means previous queue element
i.remove();
}
}
System.out.println(var); // prints: [A, C, E]
关于Java如何使用ListIterator作为队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580495/