Creating an Iterator in Java

I have the following class:

public abstract class MapObjects<MapleMapObject> {
    private Map map;
    private HashMap<Integer, MapleMapObject> objects;

    public MapObjects(Map map) {
        this.map = map;
        this.objects = new HashMap<>();
    }

    public void add(MapleMapObject object) {
        objects.put(map.getObjectId(), object);

        onAdd();
    }

    public void remove(MapleMapObject object) {
        onRemove();

        objects.remove(object.getObjectId());
    }

    protected abstract void onAdd();

    protected abstract void onRemove();
}

I want to create an iterator so that I can iterate over classes that extend from this class. For example, if I have a class with a name MapCharacters extends MapObjects<Character>, I want to be able to do the following:

characters = new MapCharacters(this);
for (Character character : characters)

How can this be achieved?

+4
source share
2 answers

If you just want to iterate over the map objects, you can just call values()on that and then create an iterator from this set of values:

public abstract class MapObjects<MapleMapObject> implements Iterable<MapleMapObject> {

    ...

    @Override public Iterator<MapleMapObject> iterator() {
        return objects.values().iterator();
    }
}
+9
source

objects.values().iterator(), , remove(), objects onRemove(). , .

, , Iterator, remove UnsupportedOperationException:

return Collections.unmodifiableCollection(objects.values()).iterator();

, Iterator remove, onRemove(), , Iterator . , - .

public abstract class MapObjects<MapleMapObject> implements Iterable<MapleMapObject> {

    ...

    @Override 
    public Iterator<MapleMapObject> iterator() {
        return new Iterator<MapleMapObject>() {

            private final Iterator<MapleMapObject> iterator = objects.values().iterator();

            @Override
            public boolean hasNext() {
                return iterator.hasNext();
            }

            @Override
            public MapleMapObject next() {
                return iterator.next();
            }

            @Override
            public void remove() {
                onRemove();
                iterator.remove();
            }
        };
    }
}
0

Source: https://habr.com/ru/post/1606848/


All Articles