Autor Tema: Java ArrayList mejorar eficiencia de código reducir número iteraciones CU00920C  (Leído 3122 veces)

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Buenas a todos.

Esta es mi solución al ejercicio de la entrega CU00920C del curso Lenguaje de Programación Java Nivel Avanzado I.

Clase Cuadrupedo.
Código: [Seleccionar]
package javaAvanzado;
public class Cuadrupedo {
    private int idCuadrupedo;
    private String tipo;
   
    public Cuadrupedo (int idCuadrupedo, String tipo) {
        this.idCuadrupedo=idCuadrupedo;
        this.tipo=tipo;
    }
   
    public void setIdCuadrupedo (int idCuadrupedo) {
        this.idCuadrupedo=idCuadrupedo;
    }
   
    public void setTipo (String tipo) {
        this.tipo=tipo;
    }
   
    public int getIdCuadrupedo() {return idCuadrupedo;}
   
    public String getTipo() {return tipo;}
   
    @Override
    public String toString() {
        return "Cuadrupedo -> ID: "+idCuadrupedo+". Tipo: "+tipo+".\n";
    }
   
}       

Clase TestCuadrupedo (main)
Código: [Seleccionar]
package javaAvanzado;
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
import java.util.Iterator;
public class TestCuadrupedo {
    public static void main (String [] args) {
        List<Cuadrupedo> lista = new ArrayList<Cuadrupedo>();
        Random r = new Random();
        String tipo="";
        Cuadrupedo temporal;
        int sumaLeones=0;
        int sumaGatos=0;
        int sumaPerros=0;
        int sumaElefantes=0;
        for (int i=0; i<10000; i++) {
            int numeroRandom = r.nextInt(4);
            switch (numeroRandom) {
                case 0: tipo="Elefante"; break;
                case 1: tipo="Perro"; break;
                case 2: tipo="Gato"; break;
                case 3: tipo="Leon"; break;
            }
            lista.add(new Cuadrupedo(i+1, tipo));
        }
        Iterator<Cuadrupedo> it = lista.iterator();
        while (it.hasNext()) {
            temporal=it.next();
            if(temporal.getIdCuadrupedo()%1000==0) {System.out.print(temporal);}
            if(temporal.getTipo().equals("Elefante")) {
                sumaElefantes++;
            }
            else if(temporal.getTipo().equals("Perro")) {
                sumaPerros++;
            }
            else if(temporal.getTipo().equals("Gato")) {
                sumaGatos++;
            }
            else {
                sumaLeones++;
            }
        }       
        System.out.println ("Resumen: hay "+sumaLeones+" leones, "+sumaGatos+" gatos, "+sumaPerros+" perros y "+sumaElefantes+" elefantes.");           
    }
}

¡Saludos!
« Última modificación: 24 de Enero 2017, 16:58 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas Erik veo el ejercicio bien resuelto. Me atrevo a plantearte una reflexión para que pienses sobre si sería útil.

Tal y como lo has planteado, primero recorres 10000 veces un bucle para crear los elementos del ArrayList y luego recorres 10000 veces otro bucle para contar los elementos de cada tipo.

En total has hecho 20000 iteraciones

¿Y si hicieras un recorrido donde al mismo tiempo que creas los elementos los cuentas (al mismo tiempo)? Esto serían 10000 iteraciones

Luego extrayendo los elementos múltiplos de 10000 necesitarías sólo unas pocas operaciones más. En total habrías hecho (redondeando) 10000 iteraciones en lugar de 20000.

Si se logra esto, podríamos decir que hemos mejorado la eficiencia del código.

Si lo intentas pega el código a ver cómo sale

Salu2

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Buenas Ogramar.

Muchas gracias por tu reflexión; es totalmente acertada. He modificado la clase y ahora los cuadrúpedos se crean, cuentan e imprimen en un solo bucle, ahorrando iteraciones y líneas de código. Así es como lo he hecho:

Código: [Seleccionar]
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class TestCuadrupedo {
    public static void main (String [] args) {
        List<Cuadrupedo> lista = new ArrayList<Cuadrupedo>();
        Random r = new Random();
        String tipo="";
        Cuadrupedo temporal;
        int sumaLeones=0;
        int sumaGatos=0;
        int sumaPerros=0;
        int sumaElefantes=0;
        System.out.println ("Cuadrúpedos cuyo ID es múltiplo de 1000:");
                for (int i=0; i<10000; i++) {
            int numeroRandom = r.nextInt(4);
            switch (numeroRandom) {
                case 0: tipo="Elefante"; sumaElefantes++; break;
                case 1: tipo="Perro"; sumaPerros++; break;
                case 2: tipo="Gato"; sumaGatos++; break;
                case 3: tipo="Leon"; sumaLeones++; break;
            }
            if ((i+1)%1000==0) {
                temporal = new Cuadrupedo(i+1, tipo); System.out.print(temporal); lista.add(temporal);
            } else {
                lista.add(new Cuadrupedo(i+1, tipo));
            }
        }
        System.out.println ("Resumen: hay "+sumaLeones+" leones, "+sumaGatos+" gatos, "+sumaPerros+" perros y "+sumaElefantes+" elefantes.\n");           
    }
}

¡Un saludo y gracias de nuevo!

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buen ejemplo de mejora de un código

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

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".