Как удалить элемент из частного ArrayList в родовом классе

У меня есть общий класс MyArray, где частным членом является ArrayList, а внутри - итератор.

В Main дается некоторый MyArray со строками, и я хочу удалить все "тест" из него... Проблема в итераторе, метод удаления не работает

Вот как выглядит класс:

public class MyArray<e> {
 private ArrayList<e> list;

 public MyArray() {
 list = new ArrayList<e>();
 }

 public int length() { return list.size(); }

 public E at(int pos) { return list.get(pos); }

 public void add(E val) { list.add(val); }

 public void remove(int pos) { list.remove(pos); }

 public class MyIterator implements Iterator<e>{
 int index;

 @Override
 public boolean hasNext() {
 return index < list.size();
 }

 @Override
 public E next() {
 if (!hasNext())
 throw new NoSuchElementException("no next value");
 E tmp = list.get(index);
 index++;
 return tmp;
 }

 }

 public Iterator<e> iterator() {
 return new MyIterator();
 }

 public static void main(String[] args) { 
 MyArray<string> b = new MyArray<string>();
 b.add("This");
 b.add("is");
 b.add("test");
 b.add("please");
 b.add("delete");
 b.add("all");
 b.add("test");

 Iterator<string> iter = b.iterator();
 while(iter.hasNext())
 System.out.println(iter.next());

 for(Iterator<string> i = b.iterator(); i.hasNext(); ) {
 String tmp = i.next();
 if (tmp.equals("test"))
 i.remove();
 }

 Iterator<string> ite = b.iterator();
 while(ite.hasNext())
 System.out.println(ite.next());
 }

}
</string></string></string></string></string></e></e></e></e></e>

Исключение, которое я получаю:

Exception in thread "main" java.lang.UnsupportedOperationException: remove
 at java.util.Iterator.remove(Unknown Source)
 at cas1.MyArray.main(MyArray.java:71)
3 ответа

Итератор в интерфейсе, и вам нужно реализовать каждый из методов Iterator в MyIterator, который вы намереваетесь вызывать.


Вам необходимо переопределить remove() в вашем Iterator.

Однако было бы проще, если бы ваш метод iterator() возвращал list.iterator(), а не реализовал его самостоятельно:

public Iterator<e> iterator() {
 return list.iterator();
 }
</e>


MyIterator который вы определили, не переопределяет Iterator.remove() а remove() определенный в интерфейсе Iterator определяется как метод по умолчанию, который вызывает UnsupportedOperationException:

default void remove() {
 throw new UnsupportedOperationException("remove");
}

Поэтому переопределите это просто, чтобы эффективно удалить итерированный элемент.

Вы можете положиться на код ArrayList.Itr:

public void remove() {
 if (lastRet < 0)
 throw new IllegalStateException();
 checkForComodification();

 try {
 ArrayList.this.remove(lastRet);
 cursor = lastRet;
 lastRet = -1;
 expectedModCount = modCount;
 } catch (IndexOutOfBoundsException ex) {
 throw new ConcurrentModificationException();
 }
}

licensed under cc by-sa 3.0 with attribution.