Как удалить элемент из частного 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.