Foro sobre Java SE > Nuevo en Java, problema metodos
Pues básicamente se basa en que en alguna(s) colección(es) tengas guardadas todos los grados y todas las asignaturas y...
3 . Recorras todos los grados y la asignaturas de ellos y recuperes todas las asignaturas que comparten.
4. Recorras todas las Asignaturas para comprobar que le ID no está repetido.
Por eficiencia tener lista Sets y recorrerlos puede ser costoso así que yo usaría hashtable para guardar los ids ya usados.
Sigue un test que comprueba los tiempos empleados en realizar 100.000 iteraciones de unas listas con 1.000 elementos aleatorios.
Una List emplea 70ms mientras que un Set 978ms en mi sistema.
Intel i5 3600Mhz, Windows 8.1, JavaSE 1.8
Las diferencias se reducen si el tamaño de la lista es menor.
Con estos tiempos, dado el número de iteraciones empleado, es irrelevante en la práctica.
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Random random = new Random();
List<Integer> listaEnteros = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) {
listaEnteros.add(random.nextInt());
}
Set<Integer> setEnteros = new HashSet<>(listaEnteros);
for (int i = 0; i < 100000; i++) {
listaEnteros.stream().forEach((Integer entero) -> {
});
setEnteros.stream().forEach((Integer entero) -> {
});
}
long inicioLista = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
listaEnteros.stream().forEach((Integer entero) -> {
});
}
System.out.println("tiempo lista enteros= " + (System.currentTimeMillis() - inicioLista));
long inicioSet = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
setEnteros.stream().forEach((Integer entero) -> {
});
}
System.out.println("tiempo set enteros= " + (System.currentTimeMillis() - inicioSet));
}
}
No entiendo la recomendación de usar Hashtable en este caso, ya que implementa Map, cuando se trata de manejar listas.
http://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html
Por otra parte, siendo totalmente thread-safe, su rendimiento es claramente inferior a HashMap y a ConcurrentHashMap.
"As of the Java 2 platform v1.2, this class was retrofitted to implement the Map interface, making it a member of the Java Collections Framework. Unlike the new collection implementations, Hashtable is synchronized. If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use ConcurrentHashMap in place of Hashtable."
Buenas, antes de nada decir que estoy empezando con java, llevo poco tiempo y ahora mismo estoy pillado con lo siguiente:
Teniendo implementados los metodos createAsignatura y createGrado tal que asi:
public static Asignatura createAsignatura(String nombre, String codigo,
Double numCreditos, TipoAsignatura tipo, Integer curso,
String departamento) {
return new AsignaturaImpl(nombre, codigo, numCreditos, tipo, curso,
departamento);
}
public static Grado createGrado(String nombre, String centro,
Set<Asignatura> obligatorias, Set<Asignatura> optativas,
Double minimoCreditosOptativas) {
return new GradoImpl(nombre, centro, obligatorias, optativas,
minimoCreditosOptativas);
}
Se pide lo siguiente:
3. Incorpore el siguiente método, añadiendo todo lo que considere necesario a la clase para implementar la propiedad poblacional “asignaturas comunes”. Esta propiedad almacena las asignaturas comunes a todos los grados creados hasta el momento a través de la factoría.
public static Set<Asignatura> getAsignaturasComunes()
4. Realice los cambios que considere oportunos para que el método createAsignatura compruebe que el código de la nueva asignatura que se va a crear no haya sido utilizado previamente. Si el código ya ha sido utilizado, el método debe lanzar una excepción de tipo ExcepcionAsignaturaNoValida.
Ando muy pillado con eso, no se por donde meterle mano.
Muchas gracias de antemano. Un saludo