Closed drg1006 closed 1 year ago
Estoy intentando realizar la modificación según comento Álvar ayer, creando una tabla con los profesores y en cada uno de ellos los tfgs por curso de cada uno.
El código que utilizo es el siguiente:
List<String> tutoresEPS = fachadaDatos.getProfesores();
// Hashmap con clave curso y value : double valor n tfgs
HashMap<String, Double> cursoTFG = new HashMap<>();
// Hashmap con clave nombre del tutor y value : hashmap de cursoTFG
HashMap<String, HashMap<String, Double>> tabla = new HashMap<String, HashMap<String, Double>>();
HistoricProjectsView vista = new HistoricProjectsView();
// Asignamos un curso a cada proyecto
vista.initProjectsStructures();
// Asignamos las keys, que serán los tutores y los cursos a cada tutor, con
// valor 0 inicial
for (String profe : tutoresEPS) {
for (String curso : vista.courses) {
cursoTFG.put(curso, 0.0);
}
tabla.put(profe, cursoTFG);
}
// Recorremos el historico
for (int i = 0; i < vista.dataHistoric.size(); i++) {
// Comprobamos que el tutor 1 esta en la EPS
if (tabla.containsKey(vista.dataHistoric.get(i).getTutor1())) {
// Cogemos el curso del TFG y su tutor
String cursoDelTFG = vista.dataHistoric.get(i).getCourse();
String tutorDelTFG = vista.dataHistoric.get(i).getTutor1();
// Le sumamos 1 al tutor de este tfg, en ese curso
// NO LO HACE BIEN
// LO SUMA A TODOS Y NO AL QUE PONE
tabla.get(tutorDelTFG).replace(cursoDelTFG, tabla.get(tutorDelTFG).get(cursoDelTFG) + 1.0);
}
}
De esta forma tengo una Map con key profesores y para cada uno de ellos otro Map con key cada curso, y dentro de ellos lo inicializo a 0.
El problema es que no realiza bien la actualización en
tabla.get(tutorDelTFG).replace(cursoDelTFG, tabla.get(tutorDelTFG).get(cursoDelTFG) + 1.0);
ya que actualiza todas las entradas y no la del tutor que busco, no entiendo porqué. De esta forma cada vez que encuentra un tfg se lo suma a todos.
La tabla se inicializa bien, con valores 0.0 para cada curso de cada tutor.
Lo mejor es que hagas un MWE (minimal working example) de lo que quieres hacer. Es decir, yo haría un pequeño programita en Java (un prototipo) que solo contenga un main y que lo que haga sea leer un fichero de texto que contenga nombres de tutores por ejemplo y que vaya leyendo y actualizando tu tabla hash en función de si encuentra o no el nombre en el fichero.
La idea es simplificar el problema y ver que los accesos los haces bien, una vez esto ya te funcione, metes un map dentro de un map y compilcas para en vez de leer un fichero con nombres leas el csv con TFGs
La lectura se hace bien, el problema que tengo es que no se cómo actualizar la tabla, es decir el hashmap dentro del map que ya tengo.
Con el código previo el resultado es el siguiente tras una única iteración sobre la pestaña de históricos:
El curso y tutor del tfg que leemos son los que se muestran al comienzo, y después los values de ese tutor antes y después de realizar la suma. El problema es que no se porqué, se suma a todos los tutores, es decir, la línea
tabla.get(tutorDelTFG).put(cursoDelTFG, tabla.get(tutorDelTFG).get(cursoDelTFG) + 1.0);
obviamente es errónea y suma a todos los tutores en lugar del que le indico en el get.
Y si pruebas en un ejemplo de "juguete" a acceder o actualizar un hashmap dentro de un hashmap te funciona?
No me funcionaba tampoco.
He conseguido obtener el siguiente resultado en una tabla Hash como con la que trabajamos anteriormente y aunque he tenido que aumentar la complejidad del programa pero no tarda apenas nada de tiempo en realizarse.
El código es el siguiente:
List<String> tutoresEPS = fachadaDatos.getProfesores();
// Hashmap con clave nombre del tutor y value : hashmap de cursoTFG
HashMap<String, HashMap<String, Double>> tabla = new HashMap<String, HashMap<String, Double>>();
HistoricProjectsView vista = new HistoricProjectsView();
// Asignamos un curso a cada proyecto
vista.initProjectsStructures();
for (String profes : tutoresEPS) {
HashMap<String, Double> esteTFG = new HashMap<>();
// Recorremos el historico
for (int i = 0; i < vista.dataHistoric.size(); i++) {
// Comprobamos que el tutor 1 esta en la EPS
// Cogemos el curso del TFG y su tutor
String cursoDelTFG = vista.dataHistoric.get(i).getCourse();
String tutorDelTFG = vista.dataHistoric.get(i).getTutor1();
String tutor2DelTFG = vista.dataHistoric.get(i).getTutor2();
//Comprobamos si es tutor1 y si el tutor2 es de la EPS o si es tutor2 para sumar 1.0 o 0.5
if (profes.equals(tutorDelTFG)) {
if (tutoresEPS.contains(tutor2DelTFG)) {
if (esteTFG.get(cursoDelTFG) != null) {
esteTFG.put(cursoDelTFG, esteTFG.get(cursoDelTFG) + 0.5);
} else {
esteTFG.put(cursoDelTFG, 0.5);
}
} else {
if (esteTFG.get(cursoDelTFG) != null) {
esteTFG.put(cursoDelTFG, esteTFG.get(cursoDelTFG) + 1.0);
} else {
esteTFG.put(cursoDelTFG, 1.0);
}
}
} else if (profes.equals(tutor2DelTFG)) {
if (esteTFG.get(cursoDelTFG) != null) {
esteTFG.put(cursoDelTFG, esteTFG.get(cursoDelTFG) + 0.5);
} else {
esteTFG.put(cursoDelTFG, 0.5);
}
}
}
tabla.put(profes, esteTFG);
}
for (String key : tabla.keySet()) {
System.out.println("TUTOR " + key + " values: " + tabla.get(key));
}
El resultado es el siguiente (y comprobado que guarda bien los tfgs) :
Faltaría adaptar ahora el tema de dibujar la gráfica obteniendo los datos de esta tabla.
Se ha conseguido realizar todo el proceso, y lo hace de forma mucho más rápida que antes. Se ha subido a heroku la actualización y el resultado que se ve en el código commit.
Si me podéis comentar que funciona y va rápido cierro ya el issue. @alvarag @annuskeras
Sí, acabo de probarlo y es mucho más rápido. Enhorabuena
Como se estuvo hablando, al crear una gráfica con varios departamentos o áreas la aplicación tarda mucho debido a su complejidad.
Se está intentado rebajar este tiempo realizando nuevos métodos para obtener la información.