drg1006 / Gestor-TFG-2022

Proyecto sobre la evolución de una aplicación de gestión de procesos de oferta, búsqueda, asignación y evaluación de los TFG de la carrera de Ingeniería Informática de la UBU.
https://gestor-tfg-2022.herokuapp.com/
MIT License
0 stars 1 forks source link

Aumentar eficiencia pantalla de histórico de profesores #97

Closed drg1006 closed 1 year ago

drg1006 commented 1 year ago

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.

drg1006 commented 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.

alvarag commented 1 year ago

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

drg1006 commented 1 year ago

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:

image

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.

alvarag commented 1 year ago

Y si pruebas en un ejemplo de "juguete" a acceder o actualizar un hashmap dentro de un hashmap te funciona?

drg1006 commented 1 year ago

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) :

image

Faltaría adaptar ahora el tema de dibujar la gráfica obteniendo los datos de esta tabla.

drg1006 commented 1 year ago

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

asermam commented 1 year ago

Sí, acabo de probarlo y es mucho más rápido. Enhorabuena