POO-ITBA / 2024_01

Consultas 1C 2024
0 stars 0 forks source link

Ejercicio 4 de Repaso Segundo Parcial #13

Open Martin192003 opened 3 months ago

Martin192003 commented 3 months ago

Hola profe, cómo está?? Hablo para cosnultarle si está bien este ejercicio. El resultado me da lo que tiene que dar pero siento que repetí código con el addForBoarding y los iteradores, siento que una posibilidad para corregir eso puede ser una clase abstracta en vez de una interfaz pero no me sonaba por eso también quería consultar. Muchas gracias por sue tiempo!


public class CategoryBoardingFlight implements BoardingFlight{

    private SortedSet<Passenger> set= new TreeSet<>(new Comparator<Passenger>() {
        @Override
        public int compare(Passenger o1, Passenger o2) {
            int cmp=o1.getCategory().compareTo(o2.getCategory());
            if(cmp==0){
                cmp= o1.getName().compareTo(o2.getName());
            }
            return cmp;
        }
    });

    @Override
    public void addForBoarding(String name, int fila, PassengerCategory categoria) {
        set.add(new Passenger(name, fila,categoria));
    }

    @Override
    public Iterator<String> boardingCallIterator() {
        return new Iterator<String>() {
            private final Iterator<Passenger> it = set.iterator();
            @Override
            public boolean hasNext() {
                return it.hasNext();
            }

            @Override
            public String next() {
                if(!hasNext()){
                    throw new NoSuchElementException();
                }
                return it.next().getName();
            }
        };
    }
}

public class RowBoardingFlight implements BoardingFlight{

    private final SortedSet<Passenger> set = new TreeSet<>(new Comparator<Passenger>() {
        @Override
        public int compare(Passenger o1, Passenger o2) {
            int cmp=Integer.compare(o1.getFila(),o2.getFila());
            if(cmp==0){
                cmp=o1.getName().compareTo(o2.getName());
            }
            return cmp;
        }
    });

    @Override
    public void addForBoarding(String name, int fila, PassengerCategory categoria) {
        set.add(new Passenger(name, fila, categoria));
    }

    @Override
    public Iterator<String> boardingCallIterator() {
        return new Iterator<String>() {
            private final Iterator<Passenger> it= set.iterator();
            @Override
            public boolean hasNext() {
                return it.hasNext();
            }

            @Override
            public String next() {
                if(!hasNext()){
                    throw new NoSuchElementException();
                }
                return it.next().getName();
            }
        };
    }
}

public interface BoardingFlight {

    void addForBoarding(String name, int fila, PassengerCategory categoria);

    Iterator<String> boardingCallIterator();

}
fmeola commented 3 months ago

Hola @Martin192003 No está bien porque como bien sospechás estás repitiendo código. Lo único que cambia entre CategoryBoardingFlight y RowBoardingFlight es el criterio de orden por lo que no deberías repetir el código de:

La posibilidad que planteás es correcta, deberías modelar una clase abstracta que tenga una variable de tipo Set donde en principio no podés instanciarla del todo porque no tenés el criterio de orden (un constructor en la clase abstracta que exija un Comparator por parámetro así los constructores de las clases hijas que ya saben qué criterio de orden usar lo invocan con super). Entonces en la clase abstracta tenés una variable de tipo Set donde podés hacer add y donde podés iterar por los elementos.

Por otro lado también podés modularizar la comparación orden alfabético por nombre:

o1.getName().compareTo(o2.getName());

haciendo que Passenger tenga ese orden natural o lo planteás en un método auxiliar

Martin192003 commented 3 months ago

Perfecto profe, ahí lo arreglo entonces, muchas gracias!!