Autor Tema: Java Diferencias entre ArrayList y LinkedList ventajas e inconvenientes CU00921C  (Leído 3422 veces)

fmartinez25

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Hola a todos. Aquí dejo mi implementación del ejercicio CU00921C del tutorial pdf de programación avanzada en Java. He implementado ambas opciones, ArrayList y LinkedList, en el mismo programa, para facilitarme la comparación de los resultados y practicar la aplicación del polimorfismo.

Los procedimientos de creación de las listas y de eliminación-inserción, los he implementado como métodos de la clase principal. Además, aunque no se pedía en el ejercicio, he incluido un método para mostrar el contenido de las listas y lo he usado para mostrar los resúmenes.


Clase Vehiculo

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

public class Vehiculo {
    private int idVehiculo;
    private String tipo;
   
    public Vehiculo(int id, String tipo){
        idVehiculo=id;
        this.tipo=tipo;
    }
    public void setIdVehiculo(int id){idVehiculo=id;}
    public void setTipo(String tipo){this.tipo=tipo;}
    public int getIdVehiculo(){return idVehiculo;}
    public String getTipo(){return tipo;}
    @Override
    public String toString(){
        return "Vehiculo-> ID: "+idVehiculo+" Tipo: "+tipo;
    }
}


Clase Principal

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

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class CU00921CEjercicio {

    public static void main(String[] args) {
        List<Vehiculo> listaarray = new ArrayList();
        List<Vehiculo> listalinked = new LinkedList();
        String[] tipos ={"Coche", "Camion", "Furgoneta", "Moto"};
        cargarLista(listaarray,tipos);
        System.out.println("Ejecución con ArrayList\n");
        imprimirLista(listaarray,"inicial",false);
        eliminarInsertar(listaarray);
        System.out.println("\nEjecución con LinkedList\n");
        cargarLista(listalinked,tipos);
        imprimirLista(listalinked,"inicial",false);
        eliminarInsertar(listalinked);
       
    }
    //Método que permite imprimir la lista o sólo el resumen
    private static void imprimirLista(List<Vehiculo> lista, String momento, boolean resumen){
        int coches=0, camiones=0, furgonetas=0, motos=0;
        for (int i=0;i<lista.size();i++){
            if(resumen){System.out.println(lista.get(i));}
            switch (lista.get(i).getTipo()) {
                case "Coche":
                    coches++;
                    break;
                case "Camion":
                    camiones++;
                    break;
                case "Furgoneta":
                    furgonetas++;
                    break;
                default:
                    motos++;
                    break;
            }
        }
        System.out.println("Resumen lista "+momento+": hay "+coches+" Coches, "+camiones+" Camiones, "+furgonetas+ " Furgonetas y "+motos+" Motos");
    }
   
    //Método para general la lista
    private static void cargarLista(List<Vehiculo> lista, String[] tipos){
        Random rnd = new Random();
        for (int i=1;i<=5000;i++){
            lista.add(new Vehiculo(i,tipos[rnd.nextInt(4)]));
        }       
    }
    //Método para eliminar-insertar
    private static void eliminarInsertar(List<Vehiculo> lista){
        long inicio, fin;
        Vehiculo tmp;
        int eliminados=0;
        int ultimoId;
        //Eliminar elementos no Coche
        inicio = System.nanoTime();
        Iterator<Vehiculo> it = lista.iterator();
        while(it.hasNext()){
            tmp=it.next();
            if(!tmp.getTipo().equals("Coche")){it.remove();eliminados++;}
        }
        //Insertar tantos vehiculos Coche como se han eliminado
        ultimoId=lista.get(lista.size()-1).getIdVehiculo();
        for (int i=ultimoId; i<ultimoId+eliminados;i++){
            lista.add(new Vehiculo(i,"Coche"));
        }
        fin=System.nanoTime();
        System.out.println("Una vez realizada la eliminación-inserción:");
        System.out.println("Tiempo empleado en eliminación-inserción (en nanosegundos): "+(fin-inicio));
        imprimirLista(lista,"final",false);       
    }   
}

En cuanto a las preguntas del ejercicio, estas serían mis respuestas:

a y b) Resultados:

Código: [Seleccionar]

Ejecución con ArrayList

Resumen lista inicial: hay 1264 Coches, 1193 Camiones, 1267 Furgonetas y 1276 Motos
Una vez realizada la eliminación-inserción:
Tiempo empleado en eliminación-inserción (en nanosegundos): 4065861
Resumen lista final: hay 5000 Coches, 0 Camiones, 0 Furgonetas y 0 Motos

Ejecución con LinkedList

Resumen lista inicial: hay 1298 Coches, 1250 Camiones, 1237 Furgonetas y 1215 Motos
Una vez realizada la eliminación-inserción:
Tiempo empleado en eliminación-inserción (en nanosegundos): 1971780
Resumen lista final: hay 5000 Coches, 0 Camiones, 0 Furgonetas y 0 Motos

c) Después de varias ejecuciones, se observa que el tiempo empleado usando ArrayList es siempre más del doble del que se obtiene usando LinkedList, lo que creo que se debe a que, después del borrado, las nuevas inserciones se producen al final (en este caso concreto se han debido producir 3.702 inserciones.

Es cierto que se han producido el mismo número de eliminaciones, que la mayoría de ellas se han debido producir en posiciones intermedias, y que éstas son más rápidas (según se nos indica en el texto) con ArrayList, por lo que deduzco que la eficiencia de LinkedList en las inserciones en posiciones finales supera con creces la ventaja en eficiencia de eliminaciones en posiciones intermedias obtenidas con ArrayList.
« Última modificación: 09 de Junio 2018, 19:13 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, ejercicio bien resuelto con el código bien estructurado.

En una ejecución he obtenido estos resultados:

Citar
Ejecución con ArrayList

Resumen lista inicial: hay 1278 Coches, 1217 Camiones, 1277 Furgonetas y 1228 Motos
Una vez realizada la eliminación-inserción:
Tiempo empleado en eliminación-inserción (en nanosegundos): 5572328
Resumen lista final: hay 5000 Coches, 0 Camiones, 0 Furgonetas y 0 Motos

Ejecución con LinkedList

Resumen lista inicial: hay 1296 Coches, 1248 Camiones, 1206 Furgonetas y 1250 Motos
Una vez realizada la eliminación-inserción:
Tiempo empleado en eliminación-inserción (en nanosegundos): 2270842
Resumen lista final: hay 5000 Coches, 0 Camiones, 0 Furgonetas y 0 Motos


Como se ha comentado, supone más del doble de tiempo la ejecución con ArrayList que con LinkedList.

Según el tipo de operación que con más frecuencia se fuera a realizar (insertar en posiciones finales, o insertar en posiciones intermedias, o eliminaciones en posiciones intermedias, etc.) nos puede resultar más conveniente utilizar una estructura de datos u otra. Esto en pequeños programas puede no tener importancia, pero para programas de tiempo real con manejo de miles de datos puede resultar crucial, de ahí lo interesante de tener todo esto en cuenta.

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