POO-ITBA / 2024_01

Consultas 1C 2024
0 stars 0 forks source link

TP06 ej 3 #9

Open manuothatceguy opened 4 months ago

manuothatceguy commented 4 months ago

Hola, quería saber si mi resolución está bien (el testeo lo pasa) o si se le puede mejorar en algo. Mis dudas son:

Acá mi código:

public class PairCyclicIterator<A> implements Iterator<PairCyclicIterator.Pair<A>> {
    private final Collection<A> c;
    private Iterator<A> it;
    public PairCyclicIterator(Collection<A> c){
        this.c = c;
        this.it = c.iterator();
    }
    @Override
    public boolean hasNext(){
        return !c.isEmpty();
    }
    private A cyclicNext(){
        return it.hasNext() ? it.next() : (it = c.iterator()).next();
    }
    @Override
    public Pair<A> next(){
        if(!hasNext()){
            throw new NoSuchElementException();
        }
        A l = cyclicNext();
        A r = cyclicNext();
        return new Pair<>(l,r);
    }
    public static class Pair<E>{
        private final E l, r;
        Pair(E l, E r){
            this.l = l;
            this.r = r;
        }
        @Override
        public String toString(){
            return "# %s + %s #".formatted(l,r);
        }
    }
}

Gracias!

fmeola commented 4 months ago

Hola @manuothatceguy La implementación es correcta.

  1. Está bien plantear eso y está bien modularizado lo de cyclicNext
  2. Siempre vamos a poner como tipo de dato a la interfaz más arriba en la jerarquía que ofrezca los métodos invocados (es una buena práctica). Como sólo usamos .iterator con requerir Iterable en el constructor y guardarlo como Iterable alcanza. Desde ya exigir Collection en el constructor funciona para el programa de prueba así que no es para penalizarlo pero estás exigiendo de más cuando podías pedir Iterable.
manuothatceguy commented 4 months ago

Perfecto! Mil gracias, Franco!!