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.
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.
Vehiculopackage 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; }
}
ListaDeVehiculospackage 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!