Java如何使用ListIterator作为队列?

标签 java vector stack queue

这是我原来的代码。

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/

相关文章:

merge - 如何在 ImageJ 中将不同的堆栈合并在一起?

java - 后缀到中缀 - 括号

java - 仅当键不存在时如何组合两个 HashMap?

java - JPA 使用替代 "persistence.xml"

c++ - 在类中使用 vector 创建类

c++ - 安全地迭代 std::vector 而项目可能被删除

java-当我重复使用一个元素然后将该键的值更新到 HashMap 中时,反复出现错误

java - 无法使用 Spring Boot 将 JSON 部分反序列化为 Immutables 对象

c++ - 派生类中指向基类的指针 vector

stack - 如何将一个圆圈中心化为一张卡片?