2014-01-24 2 views
1

Целью метода removeDuplicate(ArrayList<Card> l) является удаление дублированного объекта на основе атрибута card_value в классе Card, а затем его добавление в ArrayList и возврат arr.NoSuchElementException в методе next() Java

Но моя программа возвращает ошибку: NoSuchElementException на линии

dum.add((Card) it.next());

Я понятия не имею, что происходит здесь, потому что я распечатать объект, возвращаемый методом next(), он печатает отлично.

Кто-то пожалуйста, покажите мне, почему я получаю ошибку ниже реализации:

private ArrayList<Card> removeDuplicate(ArrayList<Card> l){ 
    int end = l.size(); 
    Set<Card> set = new HashSet<>(); 

    for(int i = 0; i < end; i++){ 
     set.add(l.get(i)); 
    } 
    ArrayList<Card> dummy = new ArrayList<>(); 
    Iterator it = set.iterator(); 
    while(it.hasNext()){ 
     System.out.println(it.next()); 
     dummy.add((Card) it.next()); 
    } 

    return dummy; 
} 

И это переопределяют методы:

@Override 
    public int hashCode() { 
     int hash = 5; 
     hash = 97 * hash + this.card_value; 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == this){ 
      return true; 
     } 
     if (!(obj instanceof Card)){ 
      return false; 
     } 
     Card other = (Card) obj; 
     return (this.card_value == other.card_value); 
    } 

ответ

5

Вы звоните .next() дважды. next() извлекает следующий элемент в итераторе, но вы только проверяете hasNext() перед первым.

Изменить

while(it.hasNext()){ 
    System.out.println(it.next()); 
    dummy.add((Card) it.next()); 
} 

в

while(it.hasNext()){ 
    Card nextCard = (Card) it.next(); 
    System.out.println(nextCard); 
    dummy.add(nextCard); 
} 
1

It.next() возвращает следующий элемент.

Что вы делаете в коде вызова it.next() дважды

0

, потому что следующий() перемещает указатель на каждый раз, поэтому, когда вы печатаете его, он будет печатать последний, а затем попытаться снова продолжить линию после

2

Here вы можете увидеть исходный код метода next() от java Iterator. Это выглядит примерно так:

public E next() { 
    checkForComodification(); 
    try { 
     int i = cursor; 
     E next = get(i); 
     lastRet = i; 
     cursor = i + 1; 
     return next; 
    } catch (IndexOutOfBoundsException e) { 
     checkForComodification(); 
     throw new NoSuchElementException(); 
    } 
} 

Как вы можете видеть, если вы из массива а NoSuchElementException будет отброшена. Поэтому вызов next() дважды без проверки перед каждым вызовом, если элементы по-прежнему доступны с помощью hasNext(), будет описывать поведение.

Ваш while() должен быть заменен:

while(it.hasNext()) { 
    dummy.add((Card) it.next()); 
} 

Но если вы действительно хотите распечатку, как вы есть, просто изменить его на:

while (it.hasNext()) { 
    Card card = (Card)it.next(); 
    System.out.println(card); 
    dummy.add(card); 
} 

Второй подход, тем лучше путь, когда вам нужно использовать объект более одного раза в методе или цикле, если вызванный метод может быть дорогостоящим.

Смежные вопросы