2012-11-14 148 views
1

我有一个'Deck'类,它创建了一个名为deck的ArrayList。 我正在尝试创建一个嵌套迭代器类,它以相反的顺序遍历卡。嵌套迭代器类

public class Deck { 

    //Nested Iterator class to traverse the Cards in reverse order 
    public abstract class DeckIterator implements Iterator<Card>{ 

     ListIterator it = deck.listIterator(deck.size()); 

     //Iterate in reverse. 
     while(it.hasPrevious()) { //errors 
      //System.out.println(it.previous()); 
      return it.previous(); 
     } 
    } 
} 

我曾尝试下面的建议,但我仍然没有运气... 不要照搬一个ArrayList的另一个相反的顺序,我宁愿遍历在外部类的现有的ArrayList。做这件事最有效的方法是什么?

+2

定义不起作用。 – kosa

+0

是这个java代码? –

+0

这有很多错误! –

回答

3

首先让Deck执行Iterable<Card>,这将要求您执行iterator()方法。使该方法返回嵌套的DeckIterator类的实例。

@Override 
public Iterator<Card> iterator() 
{ 
    return new DeckIterator(deck); 
} 

然后让DeckIterator实施Iterator<Card>贯彻hasNext()next()remove()方法。

private static class DeckIterator implements Iterator<Card> 
{ 

private int nextCard; 
private final List<Card> cards; 

public DeckIterator(List<Card> cards) 
{ 
    this.cards = cards; 
    this.nextCard = cards.size() - 1; 
} 

@Override 
public boolean hasNext() 
{ 
    if (nextCard < 0) 
     return false; 
    return true; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
public Card next() 
{ 
    if (hasNext()) 
     return cards.get(nextCard--); 
    return null; 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
public void remove() 
{ 

} 
} 

然后使用,

Iterator<Card> iterator = yourDeck.iterator(); 
while (iterator.hasNext()) 
{ 
Card card = iterator.next(); 
} 

到甲板上向后迭代。

但是你不需要创建自己Iterator如果你只是想反向迭代ListIterator可以为你做。

ArrayList<Card> deck = new ArrayList<Card>(); 
// Do whatever you do with your deck :P 

ListIterator<Card> li = deck.listIterator(deck.size()); 

// Iterate in reverse. 
while(li.hasPrevious()) 
{ 
    Card card = li.previous(); 
    // Do stuff with the card 
} 
+0

这就是我的目标,除了'while'错误与“非法启动类型,包li不存在, 预计,';' – binary101

+0

发表了更多的代码 –

+0

我已经调整过我的代码,它仍然错误... – binary101

0

Iterator接口,因此你需要实现它的方法。有关更多信息,请参阅this SO question

不过,或许是最简单的事情就是在你Deck

  1. 创建集合的副本,但以相反的顺序
  2. 回报超过创建方法的迭代器,收集

请注意,由于您正在迭代原始集合的副本,因此应该不会受到另一个线程添加/删除桌面卡的影响。

+0

可能需要添加解决方案的文本。已经有很多帖子因为“仅链接”答案而被标记/删除 – Woot4Moo