Autor Tema: Caso práctico comprobación de diferencias entre ArrayList y LinkedList CU00921C  (Leído 2430 veces)

Luis Fdo Carvajal

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 37
    • Ver Perfil
Buenos días, ejercicio CU00921C del tutorial de programación Java avanzado.

He tratado de desarrollar este ejercicio creando un arrayList y un LinkedList para que en tiempo de ejecución entreguen los resultados de ambos casos. Pero finalmente no logro eliminar del conteo los vehículos diferentes al objeto coche. No encuentro dónde esta el error.
Adjunto código correspondiente.
a) Implementa el programa usando ArrayList. ¿Cuál es el resultado que obtienes?

Rpta: En ambos casos el resultado final es el mismo utilizando el arrayList o el LinkedList, sólo que el primero gasta mucho mas tiempo de procesamiento.


b) Implementa el programa usando LinkedList ¿Cuál es el resultado que obtienes?

Rpta: En ambos casos el resultado final es el mismo utilizando el arrayList o el LinkedList, sólo que el segundo invierte mucho menos tiempo de procesamiento.

Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
/**
 *
 * @author itco1724
 */
public class TestVehiculo {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List<Vehiculo> cp = new ArrayList<Vehiculo>();
        List<Vehiculo> sp = new LinkedList<Vehiculo>();
        String[] Vehiculos = {"Coche", "Camion", "Furgoneta", "Moto"};

            Random r = new Random();
            Vehiculo temp = null;
            long inicio=0;
            long inicio1=0;
            long fin = 0;
            long fin1 = 0;
            int numeroCoches = 0;
            int numeroCamiones = 0;
            int numeroFurgonetas = 0;
            int numeroMotos = 0;
            int vehiculosEliminados = 0;

// LLenar las listas arrayList - LinkedList con 5000 tipos de vehiculos
           
            for(int i=0;i<5001;i++) {             
               cp.add(new Vehiculo(i,Vehiculos[r.nextInt((0)+4)]));
               sp.add(new Vehiculo(i,Vehiculos[r.nextInt((0)+4)]));
            }
                     
            Iterator<Vehiculo> it = cp.iterator();
            Iterator<Vehiculo> et = sp.iterator();
           
            while(it.hasNext()){

            temp = it.next();
            switch (temp.getTipo()){
                 case "Coche":
                    numeroCoches ++;
                    break;
                 case"Camion":
                    numeroCamiones ++;
                    break;
                 case "Furgoneta":
                    numeroFurgonetas ++;
                    break;
                 case "Moto":
                    numeroMotos ++;
                    break;
                }
            //Imprime el arrayList por completo
            //System.out.println(temp);
           
            }
            while(et.hasNext()){

            temp = et.next();
            switch (temp.getTipo()){
                 case "Coche":
                    numeroCoches ++;
                    break;
                 case"Camion":
                    numeroCamiones ++;
                    break;
                 case "Furgoneta":
                    numeroFurgonetas ++;
                    break;
                 case "Moto":
                    numeroMotos ++;
                    break;
                }
            //System.out.println(temp);
           
            }
            //Imprimir el arraList y el LinkedList con los objetos vehiculos contabilizados
            System.out.println("Resumen arraylist inicial : hay " + numeroCoches + " Coches,"+numeroCamiones + " Camiones," + numeroFurgonetas + " Furgonetas y " + numeroMotos + " Motos");
            System.out.println("Resumen LinkedList inicial : hay " + numeroCoches + " Coches,"+numeroCamiones + " Camiones," + numeroFurgonetas + " Furgonetas y " + numeroMotos + " Motos");
            //elimina todos los vehículos que no son coches de la arraylist y contabiliza el tiempo
           
            inicio = System.nanoTime();
           
            it = cp.iterator();
            while (it.hasNext()) {
            temp = it.next();
            // Eliminación de objetos del arrayList
            //if (!temp.getTipo().equals("Coche")) {it.remove(); vehiculosEliminados++;}
            if (temp.getTipo().equals("Camion") || temp.getTipo().equals("Furgoneta") || temp.getTipo().equals("Moto") ) {
                it.remove();
                vehiculosEliminados++;} 
            }
           
        //elimina todos los vehículos que no son coches del linkedList y contabiliza el tiempo
           
            inicio1 = System.nanoTime();
           
            et = sp.iterator();
            while (et.hasNext()) {
            temp = et.next();
            // Eliminación de objetos del LinkedList
            //if (!temp.getTipo().equals("Coche")) {et.remove(); vehiculosEliminados++;}
            if (temp.getTipo().equals("Camion") || temp.getTipo().equals("Furgoneta") || temp.getTipo().equals("Moto") ) {
                et.remove();
                vehiculosEliminados++;} 
            }
           
            //Añade mismo numero de coches a eliminados al arrayList
            for (int i=0; i<vehiculosEliminados; i++) {
            cp.add(new Vehiculo (numeroCoches+i+1, "Coche"));}
           
            //Añade mismo numero de coches a eliminados al LinkedList
            for (int i=0; i<vehiculosEliminados; i++) {
            sp.add(new Vehiculo (numeroCoches+i+1, "Coche"));}
           
            fin = System.nanoTime();
            fin1 = System.nanoTime();
            //Recorrer el arrayList para calcular las cantidades de vehiculos nuevamente
           
              it = cp.iterator();
             
            while (it.hasNext()) {
                Vehiculo tmp = it.next();
                if (tmp.getTipo().equals("Coche")) {numeroCoches++;}
                    else if (tmp.getTipo().equals("Camión")) {numeroCamiones++;}
                        else if (tmp.getTipo().equals("Furgoneta")) {numeroFurgonetas++;}
                else {numeroMotos++;}
            }
           
            //Recorrer el LinkedList para calcular las cantidades de vehiculos nuevamente
           
            et = sp.iterator();
             
            while (it.hasNext()) {
                Vehiculo tmp = it.next();
                if (tmp.getTipo().equals("Coche")) {numeroCoches++;}
                    else if (tmp.getTipo().equals("Camión")) {numeroCamiones++;}
                        else if (tmp.getTipo().equals("Furgoneta")) {numeroFurgonetas++;}
                else {numeroMotos++;}
            }
            System.out.println ("Tiempo empleado en eliminación-inserción (en nanosegundos): "+(fin-inicio)+".");
            System.out.println("Resumen arrayList final : hay " + numeroCoches + " Coches,"+numeroCamiones + " Camiones," + numeroFurgonetas + " Furgonetas y " + numeroMotos + " Motos");
            System.out.println ("Tiempo empleado en eliminación-inserción (en nanosegundos): "+(fin1-inicio1)+".");
            System.out.println("Resumen LinkedList final : hay " + numeroCoches + " Coches,"+numeroCamiones + " Camiones," + numeroFurgonetas + " Furgonetas y " + numeroMotos + " Motos");
    }   
}

Y la clase vehiculo
Código: [Seleccionar]
public class Vehiculo {

    private int ID;
    private String tipo;

    public Vehiculo(int ID, String tipo) {
        this.ID = ID;
        this.tipo = tipo; 
    }
   



@Override   
public String toString() { StringBuilder sb = new StringBuilder();
    return " VEHICULOS -->: ID" + ID + " " + "Tipo: "+ tipo;}

   
//Métodos
public int getID() { return ID; } //Método función para retornar el ID
public String getTipo() {return tipo;} //Método función retornar marca

 }  //Cierre de la clase
« Última modificación: 21 de Junio 2017, 18:16 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Luis Fdo Carvajal

Por favor, si creas temas en el foro, ponle un título adecuado siguiendo las indicaciones que se dan en https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0

El enunciado pedía generar 5000 objetos de tipo Vehiculo

Con el bucle for(int i=0;i<5001;i++)   estás generando 5001 objetos. Debes tener claro el manejo de bucles e índices. El índice 0 constituye el primer elemento. Luego has definido ir del 1 al 5000. Total tienes 1 + 5000 = 5001 objetos, que no es exactamente lo que pedía el ejercicio.

La expresión r.nextInt((0)+4) no parece adecuada, ya que r.nextInt(4) es lo mismo pero más claro.

El código no cumple lo que pedía el ejercicio

Además la medición de tiempo no veo que independice bien la medición de la operación con ArrayList de la operación con LinkedList, de hecho el ejercicio lo que pedía era implementar los códigos por separado, no en un mismo programa

Este ejercicio deberías replantearlo

Saludos

 

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