Hola,
según creo entender, el enunciado indica que hay que pedir una serie de datos al usuario y con ellos generar los objetos Curso y Facultad.
Además hay que generar una lista de objetos Estudiante, cuyo numero dependerá del límite que indique el usuario.
En todo esto, solo hay dos cosas que se puedan considerar "dificultosas":
1) Los nombres de los estudiantes hemos de obtenerlos de un archivo txt.
El enunciado dice que ya se proporciona un programa de ayuda para hacer esto. Supongo que tu lo tendrás.
En cualquier caso, no lo necesitamos para resolverlo. Leer archivos de texto en realidad es muy sencillo como verás luego.
2) Se nos exige que los objetos de la clase Estudiante que vayamos a generar, tengan unos identificadores (ID) únicos.
Es decir, si generamos una lista de 30 estudiantes, cada uno ha de tener un ID único e irrepetible.
No se nos dice como quieren que controlemos este asunto, nos dejan via libre para hacerlo como queramos, ya que de hecho, hay varias formas de hacerlo.
Yo me he decidido hacerlo de una forma sencilla y práctica.
Tengamos en cuenta que los objetos Estudiante que vamos a generar, necesitamos agruparlos en alguna estructura de datos, ya sea un simple arreglo o mejor en estructuras menos primitivas como por ejemplo un ArrayList.
Hay muchas estructuras para elegir y hay algunas que nos pueden facilitar el tema este de controlar que los ID sean únicos.
Una de ellas es la
estructura HashSet. Esta estructura no permite almacenar objetos "repetidos". Es decir, objetos que sean considerados iguales o equivalentes a algún objeto que ya está almacenado dentro de la estructura, serán rechazados.
Gracias a esto, podemos programar la clase Estudiante de modo que dos objetos de esta clase sean considerados equivalentes si sus ID son iguales (no importaría si el nombre del estudiante es distinto, solo se tendrá en cuenta el identificador ID)
Y entonces lo que haremos será crear objetos de la clase Estudiante de modo que si al guardarlos el HashSet lo rechaza, repetiremos el proceso de creacion una y otra vez hasta que por fin obtengamos un Estudiante con un ID no repetido y por lo tanto el HashSet sí lo admita.
Esto quizás se entienda mejor cuando veamos el código
Vamos por partes, veamos las clases que nos piden crear.
• Una clase de Estudiante. Cada estudiante tendrá un nombre y una identificación única. La identificación se selecciona al azar y debe ser única
ES fácil.
Solo dos atributos: nombre e identificador ID.
El nombre lo obtenemos como parametro desde el constructor.
El identificador lo generamos de forma interna con un numero aleatorio. Yo he decido hacerlo entre los rangos 0 y 999, aunque no se nos especifica nada.
Donde hay que prestar atención es a los dos últimos metodos: equals() y hashCode()
Estos metodos son heredados de la clase Object (en Java TODAS las clases, incluidas las creadas por nosotros, son siempre hijas de la clase Object, es algo así como la Diosa de todas las clases xD).
Podemos heredarlos y escribirlos según nuestras necesidades.
En equals(), le enseñamos a esta clase como debe compararse con otras clases para decidir si son equivalentes o no. Básicamente le decimos que si la otra clase con la que se compara es también una clase Estudiante y además el ID de esa claes es igual al suyo, entonces ha de devolver TRUE para indicar que SÍ son equivalentes.
Si el ID fuera distinto, o bien la otra clases no es una instancia (instanceof) de Estudiante, entonces ha de devolver FALSE para indicar que no son equivalentes.
En hashCode() le decimos a partir de que atributo de la clase queremos que genere un valor "hash" para que la estructuras como HashSet, HashMap o similares lo comprueben.
Estos dos metodos en conjunto, equals() y hashCode() serán los que nos ayudarán a que nuestro HashSet de Estudiantes, rechace los estudiantes con ID repetidos.
Clase Estudiante
La siguiente clase que nos piden:
• Una clase de Facultad. Cada facultad tendrá un nombre, un rango (Profesor, Profesor Asociado Profesor Asistente). Debe haber un ítem manejado por menú para que el usuario seleccione la clasificación de la facultad. Como ejemplo
o Ingrese un nombre de la facultad:
o Seleccione el rango de la facultad
§ Ingrese 1 para el profesor
§ Ingresar 2 para Profesor Asociado
§ Ingrese 3 para Profesor Asistente
Es muy sencilla.
Tambien dos atributos: nombre y rango.
Los rangos hay que elegir entre tres prefijados.
Yo lo que he hecho es que el constructor pide un valor int que suponemos le llegará correctamente con los valores 1, 2 ó 3.
Luego según el valor de ese int, establezco el String adecuado para el atributo rango.
Clase Facultad
Siguiente clase:
Una clase de curso que tiene el número de identificación del curso, la sala asignada y el horario de inicio y finalización de la clase
Esta parte del enunciado es un poco extraña.
Se supone que los Cursos tienen un nombre si nos fijamos en el ejemplo que nos proponen:
Curso: MIS 525, programación orientada a objetos
Pero en este enunciado no se menciona ningún atributo para nombre. Aún así, yo lo he incluido en el código porque obviamente es necesario.
Luego, se mencionan dos atributos: "sala" y "horario" que si también nos fijamos en el ejemplo que nos proponen, son datos que ni se le piden al usuario, ni tampoco luego son mostrados en pantalla.
Así que son atributos totalmente innecesarios....aun así, por cumplir con el enunciado lo mejor posible, los he incluido en el código, les he dado unos valores preestablecidos y así ya podemos olvidarnos de ellos, porque no sirven para nada.
Fíjate que en todas estas clases, les he incluido un método llamado toString().
Este método también es heredado de la clase Object y se emplea para que podamos crear un String con el que luego mostrar los datos de esta clase por pantalla de forma rápida y sencilla.
Bueno, y ahora viene la clase principal con el main() para la ejecución del programa.
• Una clase de registrador, que incluirá un método principal
Bien, verás que esta clase tiene dos métodos:
Uno es el metodo main() que básicamente sigue este guión:
- Pedir datos al usuario.
- Construir un objeto Curso y un objeto Facultad con estos datos.
- Generar una lista de estudiantes.
- Mostrar toda la informacion en pantalla
De estos cuatro pasos, el único que es un poco laborioso es el de Generar una lista de estudiantes, y de esto es de lo que se va encargar el segundo metodo.
Este segundo metodo recibe como parametro el "limite" de Estudiantes que el usuario ha indicado por teclado.
Este limite, no será el límite real, ya que el límite real hemos de generarlo al azar tal y como nos dicen:
Su programa seleccionará el tamaño de clase real al azar y debe estar entre la mitad del máximo y el máximo inclusive. Entonces, si el tamaño máximo de clase ingresado por el usuario es 30, entonces su tamaño real de clase está entre 15-30 inclusive.
ASí que el metodo genera el limte real siguiendo esta regla.
Luego accede al archivo de texto y va obteniendo nombres hasta llegar al limite real.
Cada vez que obtiene un nombre, genera un objeto Estudiante nuevo a partir de este nombre e intenta añadirlo a un HashSet.
Si consigue añadirlo, es que el ID del estudiante no está repetido y pasa al siguiente nombre.
Si NO consigue añadirlo, es que el ID autogenerado ya está repetido, y entonces vuelve a generar un nuevo Estudiante con el mismo nombre. Y así una y otra vez hasta que el HashSet por fin lo admita.
Una vez tenemos la lista de estudiantes generada, retornamos el HashSet para que el main() pueda trabajar con él, que lo único que hará será mostrar los datos de los Estudiantes generados recorriendo el HashSet con un bucle for.
En esta última parte del main(), la de mostrar datos, es donde se ve lo cómodo y útil que resulta valernos del método toString()
Clase Registrador
Y con esto creo que ya cumplimos con todo lo que nos piden.
Como dije antes, lo único dificil es controlar lo de los ID únicos y lo hemos resuelto fácilmente usando una estructura HashSet y codificando correctamente la clase Estudiante para indicar que el atributo
id es quien decide si dos Estudiantes son iguales (o sea, están repetidos) o no.
Lo de acceder al fichero de texto, puedes ver como se hace en el método generarListaEstudiantes(). Es muy sencillo, pero si tienes duda sobre eso o cualquier otra cosa, pregunta lo que sea.
Mi archivo txt de nombre solo tiene 42 nombres, por eso en el main le digo al usuario que como "limite" solo puede llegar hasta 42
Por ultimo, agrego aquí un listado de nombres, con los que poder probar el programa, por si alguien no tiene ninguno a mano: