Benutzerdefinierte Java-Iterator mit Typ-Verwirrung

Habe ich eine generische Klasse, die bundles, die ein Objekt und ein Auftrag:

public class OrderedObject<T> {
    private int order;
    private T object;

    public OrderedObject(int order, T object) {
        this.order = order;
        this.object = object;
    }

    public int getOrder() {
        return order;
    }

    public T getObject() {
        return object;
    }
}

Entwickelte ich eine Set Umsetzung die Geschäfte OrderedObject<T> Instanzen und herstellen möchte, eine Iterator<T> Aufzählung in der Reihenfolge erzwungen durch die gebaut-in der Reihenfolge:

public class OrderedObjectSet<T> extends AbstractSet<T> implements Set<T> {
    Set<OrderedObject<T>> s = new HashSet<OrderedObject<T>>();

    public boolean add(int order, T object) {
        return s.add(new OrderedObject<T>(order, object));
    }

    public Iterator<T> iterator() {
        return new OrderedObjectSetIterator<T>();
    }

    public int size() {
        return s.size();
    }

    private class OrderedObjectSetIterator<T> implements Iterator<T> {
        private int index;

        public boolean hasNext() {
            return index < s.size();
        }

        public T next() {
            T object = null;

            for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext(); ) {
                OrderedObject<T> o = it.next();
                if (o.getOrder() == index) {
                    object = o.getObject();
                }
            }

            index++;
            return object;
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}

Letztere Klasse nicht kompilieren, weil es scheint einige Verwirrung in der Arten in der Iterator Initialisierung bei

for (Iterator<OrderedObject<T>> it = s.iterator(); it.hasNext(); ) {

Mache ich was übersehen?

  • Sie sind sich bewusst TreeSet, richtig?
  • Hmmm... wirkt sich das hinzufügen einer public no-arg-Konstruktor OrderedObjectSetIterator<T> das problem lösen? Da werde ich misstrauisch, wenn ich sehe keine expliziten Konstruktoren.
  • Wie auch immer, ich habe nicht ein compiler praktisch, aber was passiert, wenn Sie definieren die innere Klasse als private class OrderedObjectSetIterator implements Iterator<T>? Ich denke, die T werden immer neu definiert es.
  • ausbauen mmyers Kommentar, wenn Sie TreeSet und definieren compareTo() mit Ihrem OrderedObject zu verwenden, um Feld, bekommt man Iteratoren, die effizienter sind kostenlos....
  • Und ohne schreiben alle, dass möglicherweise-fehlerhafte code.
  • Das sollte keinen Unterschied machen, weil a) der Konstruktor hat nichts mit der Leitung zu tun, dass der Fehler passiert, und b) die Standard no-arg-Konstruktor, wird automatisch vom compiler sowieso.
  • TreeSet mit benutzerdefinierten Komparator ist ein eleganter Ansatz. Danke.

InformationsquelleAutor Bart Strubbe | 2009-08-17
Schreibe einen Kommentar