Autor Tema: Java cómo implementar interface Iterable sobre clase usuario ejercicio CU00915C  (Leído 460 veces)

fmartinez25

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Hola. Aquí dejo mi solución al ejercicio CU00915C del tutorial gratuito de programación de java avanzado disponible en esta web.

Clase Principal

Código: [Seleccionar]
package cu00915c.ejercicio;

import java.util.Iterator;

public class CU00915CEjercicio {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        AvesEnZoo Aguilas=new AvesEnZoo("Aguilas",35,10,25);
        AvesEnZoo Buitres=new AvesEnZoo("Buitres",100,55,45);
        AvesEnZoo Halcones=new AvesEnZoo("Halcones",80,25,55);
        AvesEnZoo[] aves ={Aguilas,Buitres,Halcones};
        GruposDeAvesZoos grupo=new GruposDeAvesZoos(aves);
        Iterator<AvesEnZoo> it=grupo.iterator();
        System.out.println("TIPO\t\t|TOTAL\t|MACHOS\t|HEMBRAS|");
        while(it.hasNext()){
            AvesEnZoo tmp=it.next();
            System.out.println(tmp.getTipoDeAve()+" \t  "+tmp.getnumeroAves()+"\t  "+tmp.getnumeroMachos()+"\t  "+tmp.getnumeroHembras());
        }
    }
   
}

Clase AvesEnZoo

Código: [Seleccionar]
package cu00915c.ejercicio;

public class AvesEnZoo {
    private String tipoDeAve;
    private int numeroAves, numeroMachos, numeroHembras;
    //Constructores
    public AvesEnZoo(){};
    public AvesEnZoo(String tipoDeAve){
       this.tipoDeAve=tipoDeAve;
       this.numeroAves=0;
       this.numeroMachos=0;
       this.numeroHembras=0;
       
    }
    public AvesEnZoo(String tipoDeAve, int numeroAves, int numeroMachos, int numeroHembras){
       this.tipoDeAve=tipoDeAve;
       this.numeroAves=numeroAves;
       this.numeroMachos=numeroMachos;
       this.numeroHembras=numeroHembras;
       if(!datosConsistentes()){System.out.println("Error: Datos inconsistentes");}
    }
    //Métodos
    public void setTipoDeAve(String tipo){tipoDeAve=tipo;}
    public void setNumeroAves(int numero){numeroAves=numero;}
    public void setNumeroMachos(int numero){numeroMachos=numero;}
    public void setNumeroHembras(int numero){numeroHembras=numero;}
    public String getTipoDeAve(){return tipoDeAve;}
    public int getnumeroAves(){return numeroAves;}
    public int getnumeroMachos(){return numeroMachos;}
    public int getnumeroHembras(){return numeroHembras;}
    public boolean datosConsistentes(){
        if (numeroAves!=(numeroMachos+numeroHembras)){return false;}
        else{return true;}
    }
    @Override
    public String toString(){return tipoDeAve+"\tTotal: "+numeroAves+"\tMachos: "+numeroMachos+"\tHembras: "+numeroHembras;}
}

Clase GruposDeAvesZoos

Código: [Seleccionar]
package cu00915c.ejercicio;

import java.util.Iterator;

public class GruposDeAvesZoos implements Iterable{
    private AvesEnZoo[] gruposDeAves;
   
    public GruposDeAvesZoos(){}
    public GruposDeAvesZoos(AvesEnZoo[] grupo){
        this.gruposDeAves = grupo;
    }
    @Override
    public Iterator<AvesEnZoo> iterator(){
        Iterator it=new IteratorAvesEnZoo();
        return it;
    }
    //Clase interna que implementa Iterator
    protected class IteratorAvesEnZoo implements Iterator<AvesEnZoo>{
        protected int posicion;
        //Constructor
        IteratorAvesEnZoo(){posicion=0;}
       
        @Override
        public boolean hasNext(){
            if (posicion<gruposDeAves.length){return true;}else{return false;}
        }
        @Override
        public AvesEnZoo next(){
            posicion++;
            return gruposDeAves[posicion-1];
        }
        @Override
        public void remove(){
            gruposDeAves[posicion]=null;
            posicion--;
        }
    }
}


En el constructor de la clase AvesEnZoo he incluido una omprobación de la congruencia de los datos numéricos, con objeto de implementarla mejor en caso de tener que usarla en un programa que pida los datos por teclado.

Además, hay un método toString() para imprimir los datos de cada objeto independiente.

En la clase GrupoDeAvesZoos he intentado implementar el método remove(), pero no sé cómo funciona. No he conseguido resultados satisfactorios.
« última modificación: 04 de Junio 2018, 19:49 de Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2448
    • Ver Perfil
Buenas, veo el ejercicio bien resuelto. Sobre la comprobación de consistencia, parece adecuada. De hecho, lo que parece más razonable es que no existiera un dato de machos y hembras, sino que uno de los dos se calculara a partir del otro. Es lo que en la teoría se suele llamar "evitar la redundancia de datos": nunca almacenar un dato que pueda ser calculado a partir de otros ya almacenados. No obstante en la práctica esto no siempre es así (por un motivo u otro) y a veces surgen inconsistencias.

Sobre la implementación de remove puedes ver este ejercicio resuelto a ver si ayuda: https://aprenderaprogramar.com/foros/index.php?topic=5922.0

Salu2

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".