2017-08-09 34 views
0

这是我的原始代码。Java如何使用ListIterator进行队列?

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<Character> var = new LinkedList<Character>(); 

但是,我发现有对收集的ListIterator没有。

为什么只有Vector有ListIterator方法?那么,如果我将堆栈更改为队列,我是否必须更改for循环中的五行?

+1

为什么一个'Collection'有'ListIterator'除非它是一个'List'? – shmosel

+0

我很困惑 - LinkedList实现List有一个迭代器 –

+0

@ScaryWombat但是在编译时var被认为是Queue。 – Sean

回答

1

Stack类是一个List,这就是为什么你可以调用listIterator()

现在看来你想使用Queue API,但它没有ListIterator或任何其他类型的迭代器,允许你向后走。

所以,你有两个选择:

  1. 更改var变量是LinkedList类型,因为它既是一个QueueList在同一时间,这意味着你会得到两种API。

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

  2. 由于您的逻辑只需要你看/向后删除,你可以改变你的逻辑向后遍历,而不是当前的迭代前进,然后后退操作,以删除以前的元素的逻辑。

    Deque API是Queue API的扩展,用于使用“双端队列”。双端队列可以使用descendingIterator()方法向后迭代。

    Deque的优点是,有4个内置的实现,给您更多的选择:LinkedListArrayDequeConcurrentLinkedDequeLinkedBlockingDeque

如果您选择选项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] 
+0

选项二让我的生活变得如此简单:)谢谢。 – Sean