diff --git a/src/main/java/org/glavo/nbt/tag/ParentTag.java b/src/main/java/org/glavo/nbt/tag/ParentTag.java index 9abc5b1..5660770 100644 --- a/src/main/java/org/glavo/nbt/tag/ParentTag.java +++ b/src/main/java/org/glavo/nbt/tag/ParentTag.java @@ -269,6 +269,7 @@ public Iterator iterator() { return new Iterator<>() { private int cursor = 0; + private int lastRef = -1; @Override public boolean hasNext() { @@ -280,7 +281,15 @@ public T next() { if (cursor >= size) { throw new NoSuchElementException(); } - return getTag(cursor++); + return getTag(lastRef = cursor++); + } + + @Override + public void remove() { + if(lastRef < 0) throw new IllegalStateException(); + removeTagAt(lastRef); + cursor = lastRef; + lastRef = -1; } }; } diff --git a/src/test/java/org/glavo/nbt/tag/ListTagTest.java b/src/test/java/org/glavo/nbt/tag/ListTagTest.java index 79ddb02..2f7b4b0 100644 --- a/src/test/java/org/glavo/nbt/tag/ListTagTest.java +++ b/src/test/java/org/glavo/nbt/tag/ListTagTest.java @@ -238,4 +238,24 @@ void testCloneEqualsAndIndependentChildren() { assertEquals("changed", cloneFirst.get()); assertContentNotEquals(tag, clone); } + + @Test + void testParentTagIteratorRemove() { + var tag = new ListTag(); + for (int i = 0; i < 9; i++) { + tag.addTag(new IntTag(i)); + } + var iter = tag.iterator(); + while (iter.hasNext()) { + IntTag t = iter.next(); + if (t.get() % 2 == 0) { + iter.remove(); + } + } + assertContentEquals(new ListTag<>() + .addTag(new IntTag(1)) + .addTag(new IntTag(3)) + .addTag(new IntTag(5)) + .addTag(new IntTag(7)), tag); + } }