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: @mayakoski en 10 de Abril 2020, 01:04

Título: Java ejercicios resueltos diferencias entre ArrayList y LinkedList CU00921C
Publicado por: @mayakoski en 10 de Abril 2020, 01:04
Buenas tardes a todos, paso a dejar mi solución al ejercicio CU00921C del tutorial de programación java avanzado, lo he hecho tratando de cumplir con lo requerido, espero cualquier observación a modo de retroalimentación.

Saludos

Esta es mi clase Vehículo en la cual eh puesto dos métodos que me permiten obtener lo requerido, pero los he generado como estaticos, si se puede de otra manera me gustaria saberlo.


Código: [Seleccionar]
package claseCU00921C;

import java.util.Iterator;
import java.util.List;

import claseCU00919C.Animal;

public class Vehiculo {
private int idVehiculo;
private String tipo;

public String getTipo() {
return tipo;
}

public Vehiculo(int pIdVehiculo, String pTipo) {
this.idVehiculo = pIdVehiculo;
this.tipo = pTipo;
}

public String toString() {
return "El vehiculo es: " + this.idVehiculo + " Detipo: " + this.tipo;
}

public static String ContarTiposArray(List<Vehiculo> pArreglo) {
Iterator<Vehiculo> itArray = pArreglo.iterator();
Vehiculo temp = null;
int coches = 0, camiones = 0, furgonetas = 0, motos = 0;

while (itArray.hasNext()) {
temp = itArray.next();
switch (temp.getTipo()) {
case "Coche":
coches += 1;
break;
case "Camión":
camiones += 1;
break;
case "Furgoneta":
furgonetas += 1;
break;
default:
motos += 1;
break;
}
}
return coches + " Coches, " + camiones + " Camiones, " + furgonetas + " Furgonetas y " + motos + " Motos";
}

public static String EliminaInserta(List<Vehiculo> pArreglo) {
Iterator<Vehiculo> it = pArreglo.iterator();
long tiempo;
int numEliminados = 0;
Vehiculo temp = null;

tiempo = System.nanoTime();
while (it.hasNext()) {
temp = it.next();
if (temp.getTipo() != "Coche") {
it.remove();
numEliminados += 1;
}
}

pArreglo.listIterator();

for (int i = 5000; i < numEliminados + 5000; i++) {
pArreglo.add(new Vehiculo(i + 1, "Coche"));
}
System.out.println("Una vez realizada la eliminación e inserción; ");
return "Tiempo empleado en la eliminación-inserción (en nanosegundor):"
+ String.valueOf(System.nanoTime() - tiempo);
}

}

Código: [Seleccionar]
package claseCU00921C;

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

public class Programa {
public static void main(String arg[]) {

List<Vehiculo> arrayVehiculos = new ArrayList<Vehiculo>();
List<Vehiculo> linkedVehiculos = new LinkedList<Vehiculo>();

String[] tipos = { "Coche", "Camión", "Furgoneta", "Moto" };
Random tipoRandom = new Random();

for (int i = 0; i < 5000; i++) {
// En este ejemplo cada vehiculo es de un tipo aleatorio
arrayVehiculos.add(new Vehiculo(i, tipos[tipoRandom.nextInt(4)]));
linkedVehiculos.add(new Vehiculo(i, tipos[tipoRandom.nextInt(4)]));
}

System.out.println("Usando ArrayList");
System.out.println("Resumen lista inicial: hay " + Vehiculo.ContarTiposArray(arrayVehiculos));
System.out.println(Vehiculo.EliminaInserta(arrayVehiculos));
System.out.println("Resumen lista Final: hay " + Vehiculo.ContarTiposArray(arrayVehiculos));

System.out.println();

System.out.println("Usando LinkedList");
System.out.println("Resumen lista inicial: hay " + Vehiculo.ContarTiposArray(linkedVehiculos));
System.out.println(Vehiculo.EliminaInserta(linkedVehiculos));
System.out.println("Resumen lista inicial: hay " + Vehiculo.ContarTiposArray(linkedVehiculos));

}
}

Título: Re:Java ejercicios resueltos diferencias entre ArrayList y LinkedList CU00921C
Publicado por: Ogramar en 18 de Septiembre 2020, 18:39
Buenas, las observaciones que haría a este ejercicio son las siguientes.

En la clase Vehiculo aparece un método    public static String ContarTiposArray(List<Vehiculo> pArreglo) y otro método public static String EliminaInserta(List<Vehiculo> pArreglo)

Esto métodos no los veo bien ubicados dentro de la forma de programación orientada a objetos. ¿Por qué? Porque cada clase debe tener unas responsabilidades acordes a lo que representa. No es lógico que la clase Vehiculo sea responsable de recibir un List de vehículos y contar los tipos que hay en ella, porque esto no es o no debería ser responsabilidad de un vehículo. Por tanto, ese conteo debería ir en otro sitio, bien en otra clase o bien en el main. Lo mismo para el método de eliminar e insertar.

Respecto al uso de métodos estáticos el problema lo veo precisamente en el diseño. Para invocar un método de la clase, antes tienes que instanciar un objeto. En lugar de instanciar un objeto has recurrido a usar un método estático, lo cual aunque pueda hacerse no resulta un buen diseño en este caso. En lugar de esto tendrías que haber instanciado un vehículo e invocar el método sobre esa instancia. O mejor aún, tener esos métodos en otra clase o en el main, lo cual hubiera sido más lógico.

Respecto a los resultados, se cumple con lo que pedía el ejercicio. En general, los tiempos obtenidos para ejecución con ArrayList son peores que los obtenidos con LinkedList.

Ejemplo usando ArrayList tiempo empleado en la eliminación-inserción (en nanosegundor):2826794
Ejemplo usando LinkedList tiempo empleado en la eliminación-inserción (en nanosegundor):595722

Puede verse un ejemplo de este ejercicio resuelto en https://aprenderaprogramar.com/foros/index.php?topic=5781.0

Salu2