Design Pattern: Iterator

Een van de opdrachten die ik heb gemaakt is de iterator. Ik heb hiervoor gekozen omdat ik nog een keer wilde oefenen met streams en omdat het mij een leuke opdracht leek.

Hieronder mijn uitwerking van de klassen die aangepast moesten worden: Meisjes en jongens-iterator voor de “basisuitwerking” en de klassen jongensiteratorgoedkoop en meisjesiteratorgoedkoop voor de uitwerking om enkel de kledingstukken te krijgen die goedkoper waren dan €30,-.

Jongensiterator


public class JongensIterator implements Iterator<KledingStuk> {

    private List<Integer> keys;
    private HashMap<Integer, KledingStuk> items;
    private int currentPosition = 0;

    public JongensIterator(HashMap<Integer, KledingStuk> items) {
        this.items = items;
        this.keys = new ArrayList<>(items.keySet());
    }

    @Override
    public boolean hasNext() {
        return currentPosition < keys.size();
    }

    @Override
    public KledingStuk next() {
        if (!hasNext()) {
            return null;
        }
        KledingStuk item = items.get(keys.get(currentPosition));
        currentPosition++;
        return item;
    }
}

Meisjesiterator


//De iterator gaat over de gehele collectie

import java.util.Iterator;
import java.util.List;

//TODO Vul de iterator aan om hem werkend te krijgen.
public class MeisjesIterator implements Iterator {
    private List<KledingStuk> items;
    private int currentPosition = 0;

    public MeisjesIterator(List<KledingStuk> items) {
        this.items = items;
    }

    @Override
    public boolean hasNext() {
        //TODO
        return currentPosition < items.size();
    }

    @Override
    public Object next() {
        //TODO
        KledingStuk item = items.get(currentPosition);
        currentPosition++;
        return item;
    }
}

Jongensiterator-Goedkoop


import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

public class JongenIteratorGoedkoop implements Iterator<KledingStuk> {
    private final List<KledingStuk> goedkopeItems;
    private final int MAXIMALE_PRIJS = 30;
    private int currentPosition = 0;

    public JongenIteratorGoedkoop(HashMap<Integer, KledingStuk> kledingMap) {
        this.goedkopeItems = kledingMap.values()
                .stream()
                .filter(kledingStuk -> kledingStuk.getPrijs() < MAXIMALE_PRIJS)
                .collect(Collectors.toList());
    }

    @Override
    public boolean hasNext() {
        return currentPosition < goedkopeItems.size();
    }

    @Override
    public KledingStuk next() {
        if (!hasNext()) {
            throw new java.util.NoSuchElementException();
        }
        KledingStuk item = goedkopeItems.get(currentPosition);
        currentPosition++;
        return item;
    }
}

Meisjesiterator-Goedkoop


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MeisjesIteratorGoedkoop implements Iterator<KledingStuk> {
    private final List<KledingStuk> goedkopeItems;
    private int currentPosition = 0;
    private final int MAXIMALE_PRIJS=30;

    public MeisjesIteratorGoedkoop(List<KledingStuk> items) {
        this.goedkopeItems = getUnderPrice(items);
    }

    private List<KledingStuk> getUnderPrice(List<KledingStuk> items) {
        List<KledingStuk> result = new ArrayList<>();
        for (KledingStuk item : items) {
            if (item.getPrijs() < MAXIMALE_PRIJS) {
                result.add(item);
            }
        }
        return result;
    }

    @Override
    public boolean hasNext() {
        return currentPosition < goedkopeItems.size();
    }

    @Override
    public KledingStuk next() {
        KledingStuk item = goedkopeItems.get(currentPosition);
        currentPosition++;
        return item;
    }
}