Autor Tema: Java Avanzado diferencias entre ArrayList y LinkedList Ejercicio CU00921C#  (Leído 3891 veces)

Erik_Escriche

  • Principiante
  • **
  • Mensajes: 65
    • Ver Perfil
Buenas a todos. Esta es mi solución al ejercicio de la entrega CU00921C del curso Lenguaje de programación Java Nivel Avanzado I. Me he hecho bastante lío al principio porque pensaba que lo que se elimina en un iterador no afecta a la lista original y cuando trataba de suprimir los elementos en la lista original me aparecía el error ConcurrentModificationException. Creo que ahora ya está bien, pero agradezco vuestras posibles correcciones.

Citar
Crea una clase denominada Vehiculo con los atributos idVehiculo (int) y tipo (String), donde tipo podrá tomar los valores Coche, Camión, Furgoneta o Moto.

Crea una clase con el método main donde se introduzcan 5000 vehículos en una lista de tipo estático List. El atributo tipo debe establecerse para cada objeto de forma aleatoria. A continuación, el programa debe mostrar un resumen de cuántos vehículos hay de cada tipo. A continuación, debe recorrerse la lista y eliminarse todos los vehículos que no sean de tipo Coche. Por otro lado, deberán añadirse tantos vehículos de tipo Coche como se hayan eliminado, al final de la lista, de modo que los nuevos ids comenzarán a partir del último existente en la lista anterior. Además deberá mostrarse de nuevo el resumen de cuántos vehículos hay de cada tipo y el tiempo empleado desde que comenzó la eliminación de elementos hasta que terminó la inserción de elementos. Responde a estas preguntas:

a) Implementa el programa usando ArrayList. ¿Cuál es el resultado que obtienes?

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

c) Haz varias ejecuciones y compara los resultados. ¿Observas diferencias entre la ejecución con ArrayList y con LinkedList? Si observas diferencias, ¿cuáles son y a qué crees que se deben?

Realizando varias ejecuciones, he obtenido unos tiempos que oscilan entre 10666090 y 15979824 nanosegundos utilizando un ArrayList y entre 1721098 y 6345220 nanosegundos utilizando un LinkedList. Usar un LinkedList, en consecuencia, resulta más eficiente. Creo que esta diferencia se debe a que LinkedList es más rápido en las inserciones de elementos al comienzo y al final de una lista y en las supresiones.

Vehiculo
Código: [Seleccionar]
package javaAvanzado;
public class Vehiculo {
    //Atributos
    private int idVehiculo;
    private String tipo;
    //Constructor
    public Vehiculo (int idVehiculo, String tipo) {
        this.idVehiculo=idVehiculo;
        this.tipo=tipo;
    }
    //Setters y getters
    public void setIdVehiculo (int idVehiculo) {this.idVehiculo=idVehiculo;}
    public void setTipo (String tipo) {this.tipo=tipo;}
    public int getIdvehiculo () { return idVehiculo; }
    public String getTipo() { return tipo; }
}

ListaDeVehiculos
Código: [Seleccionar]
package javaAvanzado;
import java.util.List;
import java.util.LinkedList;
import java.util.Random;
import java.util.Iterator;

public class ListaDeVehiculos {
    public static void main (String [] args) {
        List<Vehiculo> lista = new LinkedList<Vehiculo>();
        Random r = new Random();     
        int sumaCoches=0;
        int sumaCamiones=0;
        int sumaFurgonetas=0;
        int sumaMotos=0;
        int vehiculosEliminados=0;
        long inicio=0;
        long fin=0;
        //Se llena la lista con 5000 elementos de tipo aleatorio.
        for (int i=0; i<5000; i++) {
            String tipo="";
            switch (r.nextInt(4)) {
                case 0: tipo="Coche"; break;
                case 1: tipo="Camión"; break;
                case 2: tipo="Furgoneta"; break;
                case 3: tipo="Moto"; break;
            }
            lista.add(new Vehiculo(i+1, tipo));
        }
        //Se recorre la lista con un iterador para obtener el número de vehículos de cada tipo.
        Iterator<Vehiculo> it = lista.iterator();
        while (it.hasNext()) {
            Vehiculo tmp = it.next();
            if (tmp.getTipo().equals("Coche")) {sumaCoches++;}
            else if (tmp.getTipo().equals("Camión")) {sumaCamiones++;}
            else if (tmp.getTipo().equals("Furgoneta")) {sumaFurgonetas++;}
            else {sumaMotos++;}
        }
        System.out.println ("Resumen: hay "+sumaCoches+" coches, "+sumaCamiones+" camiones, "+sumaFurgonetas+" furgonetas y "+sumaMotos+" motos.");
        //Se eliminan todos los vehículos que no son coches en el iterador.
        inicio = System.nanoTime();
        it = lista.iterator();
        while (it.hasNext()) {
            Vehiculo tmp = it.next();
            if (!tmp.getTipo().equals("Coche")) {it.remove(); vehiculosEliminados++;}
        }       
        //Se añade un número de coches igual al de coches eliminados.
        for (int i=0; i<vehiculosEliminados; i++) {
            lista.add(new Vehiculo (sumaCoches+i+1, "Coche"));
        }
        fin = System.nanoTime();       
        //Se recorre nuevamente el iterador para calcular el número de vehículos de cada tipo.
        sumaCoches=0; sumaCamiones=0; sumaFurgonetas=0; sumaMotos=0;
        it = lista.iterator();
        while (it.hasNext()) {
            Vehiculo tmp = it.next();
            if (tmp.getTipo().equals("Coche")) {sumaCoches++;}
            else if (tmp.getTipo().equals("Camión")) {sumaCamiones++;}
            else if (tmp.getTipo().equals("Furgoneta")) {sumaFurgonetas++;}
            else {sumaMotos++;}
        }
        System.out.println ("Resumen: hay "+sumaCoches+" coches, "+sumaCamiones+" camiones, "+sumaFurgonetas+" furgonetas y "+sumaMotos+" motos.");
        System.out.println ("Nanosegundos empleados en el proceso de eliminación e inserción: "+(fin-inicio)+".");
    }
}               

¡Un saludo!
« Última modificación: 18 de Febrero 2018, 14:34 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Java Avanzado diferencias entre ArrayList y LinkedList Ejercicio CU00921C
« Respuesta #1 en: 11 de Febrero 2017, 20:34 »
Buenas Erick el ejercicio está bien resuelto

Solo una observación: el nombre de clase ListaDeVehiculos no es adecuado para la clase con el main. El nombre de una clase debe representar lo que es o hace, en este caso la clase no representa una lista de vehículos luego el nombre no es adecuado. Sería más adecuado TestListas o similar.

Aquí se comenta la forma de nombrar clases, https://www.aprenderaprogramar.com/foros/index.php?topic=3035.msg13698#msg13698

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