2015-02-03 3 views
0

Я просмотрел этот сайт (как и в Интернете) и по какой-то причине не может найти ответ, который работает. Либо я получаю ошибку индекса за пределами границ, либо следующая часть моего кода не будет выполняться. Все, что я пытаюсь сделать, это удалить элемент из списка на Java с помощью итератора. Вот мой код:Удаление элемента из списка на Java

public boolean remove(T item) { 
    while (bag.iterator().hasNext()) { 
     T i = bag.iterator().next(); 
      if (i.equals(item)) { 
       bag.iterator().remove(); 
       return true; 
      } 
    } 
    return false; 
} 

Мой итератора наследует из моего класса «сумка», очевидно, но здесь это так:

public Iterator<T> iterator() { 
    return new Iterator<T>() { 
     private int current = 0; 

     public boolean hasNext() { 
      return current < size; 
     } 

     public T next() { 
      return data[current++]; 
     } 

     public void remove() { 
      for (int i=current-1; i<size-1; i++) 
       data[i] = data[i+1]; 
      size--; 
     } 
    }; 
} 

Любая помощь очень ценится, спасибо, ребята !!

Clayton

+0

Массив не является списком. Вы не можете выполнять те же операции в двух разных контейнерах. –

+0

@AngeloAlvisi О чем ты говоришь? – ajb

+0

@ajb Теги. Массив не является списком, а Iterator не является ListIterator, даже если Iterator можно использовать в списке. –

ответ

3

Каждый раз, когда вы звоните bag.iterator(), вы получите новый Iterator объект, а не один и тот же, который вы имели прежде. Вы должны получить итератор один раз, а затем использовать его через петлю:

public boolean remove(T item) { 
    Iterator<T> iter = bag.iterator(); 
    while (iter.hasNext()) { 
     T i = iter.next(); 
      if (i.equals(item)) { 
       iter.remove(); 
       return true; 
      } 
    } 
    return false; 
} 

Ваш код имеет еще один вопрос: если вы звоните remove() на вашем итератора перед вызовом next(), ваш код будет пытаться получить доступ data[-1]. Возможно, вы захотите установить код защиты, например:

public void remove() { 
    if(current > 0) { 
     for (int i=current-1; i<size-1; i++) 
      data[i] = data[i+1]; 
     size--; 
    } 
} 
+0

Спасибо большое, @ Джейсон. Это именно то, что я искал. Нижняя часть кода, которую вы исправили, также была моим профессором, который вскоре обнаружил, что в его оригинальной кодировке была ошибка, поэтому еще раз спасибо за то, что вы узнаете об этом. – rockandride