Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Erik_Escriche en 06 de Enero 2017, 16:24

Título: Java ArrayList mejorar eficiencia de código reducir número iteraciones CU00920C
Publicado por: Erik_Escriche en 06 de Enero 2017, 16:24
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!
Título: Re:Java ArrayList mejorar eficiencia de código reducir número iteraciones CU00920C
Publicado por: Ogramar en 24 de Enero 2017, 17:00
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
Título: Re:Java ArrayList mejorar eficiencia de código reducir número iteraciones CU00920C
Publicado por: Erik_Escriche en 24 de Enero 2017, 19:23
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!
Título: Re:Java ArrayList mejorar eficiencia de código reducir número iteraciones CU00920C
Publicado por: Ogramar en 24 de Enero 2017, 21:58
Buen ejemplo de mejora de un código

Salu2