gpt4 book ai didi

Java如何使用ListIterator作为队列?

转载 作者:行者123 更新时间:2023-12-02 12:23:43 25 4
gpt4 key购买 nike

这是我原来的代码。

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 ,或任何其他类型的允许您向后行走的迭代器。

所以你有两个选择:

  1. var 变量更改为 LinkedList 类型,因为它既是 Queue和一个List同时,这意味着您可以获得两个 API。

    LinkedList是唯一实现两者的内置类。

  2. 由于您的逻辑只需要向后查找/删除,因此您可以将逻辑更改为向后迭代,而不是当前的向前迭代,然后向后移动以删除前一个元素的逻辑。

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com