Java - POO tren

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Víctor (18 intervenciones) el 19/05/2021 09:10:28
Se desea modelizar el comportamiento de una empresa que tiene una flota de trenes, así como de la gestión de venta de billetes.

Para ello se deberán tener en cuenta los siguientes requisitos:

- Cada tren tiene un modelo de tren y un número de tren. Además tiene un número de pasajeros en clase business y un número de pasajeros en clase turista.

- Para cada tren es necesario indicar los datos del conductor (solo habrá uno) de dicho tren. El conductor del tren se identificará a través del nombre, apellidos, dni y número de conductor que es un identificador dentro de la empresa del trabajador. El dni, para ser válido, deberá tener una longitud de 9 caracteres. En caso contrario se lanzará una excepción.

- Los pasajeros del tren puede que tengan (o no) además un número de fidelización de la empresa.

- Cada tren tiene además un número de tripulantes (sin contar el conductor) que son trabajadores de la empresa. Es necesario almacenar todos los datos de los tripulantes para dicho tren. Como máximo habrá 7 tripulantes en el tren sin incluir el conductor. Un tripulante tendrá además una ubicación dentro del tren.

- Todos los trabajadores del tren (incluido el conductor) tienen un número de la SS.

- Se identifica como viaje:

- Un conjunto de pasajeros indicando los siguientes datos: nombre, apellidos, dni y número de billete.

- El tren correspondiente (con todos sus datos) y la tripulación completa indicando conductor y resto de tripulantes.

- Estación de origen y estación de destino, fecha y hora de salida y de llegada y una duración en minutos del viaje.

- Los pasajeros dentro del viaje correspondiente estarán ordenados por dni. Y deberá haber un método que permita obtener todos los datos del pasajeros a partir de dicho DNI.





Crea un programa principal que cubra un viaje para un tren AVE desde Madrid a Córdoba, con 3 pasajeros en clase Business y 2 en clase Turista, un conductor y 2 tripulantes.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 19/05/2021 12:53:46
Intenta primero identificar cuáles son las entidades/clases que toman parte en el programa y cuáles son las posibles relaciones de herencia entre ellas.
Postea aquí las que hayas identificado y comentamos si es correcto, si falta/sobra alguna, y ya luego pasaríamos a escribir el código para modelarlas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Víctor (18 intervenciones) el 19/05/2021 12:56:07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package ejer_tipo_examen;
 
public class Tren {
 
	//Atributos
	private int numTren;
	private String modelo;
	private int numPasajerosBusiness;
	private int numPasajerosTurista;
 
	//Constructor
	public Tren (int numTren, String modelo, int numPasajerosBusiness, int numPasajerosTurista) {
		this.numTren=numTren;
		this.modelo=modelo;
		this.numPasajerosBusiness=numPasajerosBusiness;
		this.numPasajerosTurista=numPasajerosTurista;
	}
 
	//Métodos
 
	/**
	 * @return the numeroTren
	 */
	public int getNumeroTren() {
		return numTren;
	}
 
	/**
	 * @param numeroTren the numeroTren to set
	 */
	public void setNumeroTren(int numeroTren) {
		this.numTren = numeroTren;
	}
 
	/**
	 * @return the modelo
	 */
	public String getModelo() {
		return modelo;
	}
 
	/**
	 * @param modelo the modelo to set
	 */
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	/**
	 * @return the numPasajerosBusiness
	 */
	public int getNumPasajerosBusiness() {
		return numPasajerosBusiness;
	}
 
	/**
	 * @param numPasajerosBusiness the numPasajerosBusiness to set
	 */
	public void setNumPasajerosBusiness(int numPasajerosBusiness) {
		this.numPasajerosBusiness = numPasajerosBusiness;
	}
 
	/**
	 * @return the numPasajerosTurista
	 */
	public int getNumPasajerosTurista() {
		return numPasajerosTurista;
	}
 
	/**
	 * @param numPasajerosTurista the numPasajerosTurista to set
	 */
	public void setNumPasajerosTurista(int numPasajerosTurista) {
		this.numPasajerosTurista = numPasajerosTurista;
	}
 
	public String toString() {
		return "Número de modelo del tren: " + numTren + "\nModelo: " + modelo + "\nNúmero de pasajeros que viajan en clase business: "  + numPasajerosBusiness +
				"\nNúmero de pasajeros que viajan en clase turista: " + numPasajerosTurista;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package ejer_tipo_examen;
 
public class Pasajeros extends Tren{
 
	//Atributos
	private String nombre;
	private String apellidos;
	private String dni;
	private int numFidelizacionEmpresa;
 
	//Constructor
	public Pasajeros (int numTren, String modelo, int numPasajerosBusiness, int numPasajerosTurista, String nombre, String apellidos, String dni, int numFidelizacionEmpresa) {
		super(numTren, modelo, numPasajerosBusiness, numPasajerosTurista);
		this.nombre=nombre;
		this.apellidos=apellidos;
		this.dni=dni;
		this.numFidelizacionEmpresa=numFidelizacionEmpresa;
	}
 
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
 
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	/**
	 * @return the apellidos
	 */
	public String getApellidos() {
		return apellidos;
	}
 
	/**
	 * @param apellidos the apellidos to set
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}
 
	/**
	 * @param dni the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	/**
	 * @return the numFidelizacionEmpresa
	 */
	public int getNumFidelizacionEmpresa() {
		return numFidelizacionEmpresa;
	}
 
	/**
	 * @param numFidelizacionEmpresa the numFidelizacionEmpresa to set
	 */
	public void setNumFidelizacionEmpresa(int numFidelizacionEmpresa) {
		this.numFidelizacionEmpresa = numFidelizacionEmpresa;
	}
 
	public String toString() {
		return super.toString() + "\nNombre: " + nombre + "\nApellidos: " + apellidos + "\nDNI: "+ dni + "\nNúmero de fidelización de la empresa: " + numFidelizacionEmpresa;
	}
 
}
*************************************
package ejer_tipo_examen;
 
public class Conductor extends Tren{
 
	//Atributo
	private String nombre;
	private String apellidos;
	private String dni;
	private int numConductor; //identificador dentro de la empresa del trabajador
	private int numSeguridadSocial;
 
	//Constructor
	public Conductor (int numTren, String modelo, int numPasajerosBusiness, int numPasajerosTurista, String nombre, String apellidos, String dni, int numConductor, int numSeguridadSocial) {
		super(numTren, modelo, numPasajerosBusiness, numPasajerosTurista);
		this.nombre=nombre;
		this.apellidos=apellidos;
		this.dni=dni;
		this.numConductor=numConductor;
		this.numSeguridadSocial=numSeguridadSocial;
	}
 
	//Métodos
 
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
 
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	/**
	 * @return the apellidos
	 */
	public String getApellidos() {
		return apellidos;
	}
 
	/**
	 * @param apellidos the apellidos to set
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}
 
	/**
	 * @param dni the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	// El dni, para ser válido, deberá tener una longitud de 9 caracteres. En caso contrario se lanzará una excepción.
 
 
	/**
	 * @return the numConductor
	 */
	public int getNumConductor() {
		return numConductor;
	}
 
	/**
	 * @param numConductor the numConductor to set
	 */
	public void setNumConductor(int numConductor) {
		this.numConductor = numConductor;
	}
 
 
	/**
	 * @return the numSeguridadSocial
	 */
	public int getNumSeguridadSocial() {
		return numSeguridadSocial;
	}
 
	/**
	 * @param numSeguridadSocial the numSeguridadSocial to set
	 */
	public void setNumSeguridadSocial(int numSeguridadSocial) {
		this.numSeguridadSocial = numSeguridadSocial;
	}
 
	public String toString() {
		return super.toString() + "\nNombre: " + nombre + "\nApellidos: " + apellidos + "\nDNI: "+ dni + "\nNúmero del conductor (identificador): " + numConductor
				+ "\nNúmero de la Seguridad Social: " + numSeguridadSocial;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package ejer_tipo_examen;
 
public class Tripulante extends Tren{
 
	//Atributos
	private String nombre, apellidos, dni, ubicacion;
	private int numSeguridadSocial;
 
	//Constructor
	public Tripulante (int numTren, String modelo, int numPasajerosBusiness, int numPasajerosTurista, String nombre, String apellidos, String dni,int numSeguridadSocial) {
		super(numTren, modelo, numPasajerosBusiness, numPasajerosTurista);
		this.nombre=nombre;
		this.apellidos=apellidos;
		this.dni=dni;
		this.numSeguridadSocial=numSeguridadSocial;
	}
 
	//Métodos
 
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
 
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	/**
	 * @return the apellidos
	 */
	public String getApellidos() {
		return apellidos;
	}
 
	/**
	 * @param apellidos the apellidos to set
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}
 
	/**
	 * @param dni the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	/**
	 * @return the ubicacion
	 */
	public String getUbicacion() {
		return ubicacion;
	}
 
	/**
	 * @param ubicacion the ubicacion to set
	 */
	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}
 
	/**
	 * @return the numSeguridadSocial
	 */
	public int getNumSeguridadSocial() {
		return numSeguridadSocial;
	}
 
	/**
	 * @param numSeguridadSocial the numSeguridadSocial to set
	 */
	public void setNumSeguridadSocial(int numSeguridadSocial) {
		this.numSeguridadSocial = numSeguridadSocial;
	}
 
	public String toString() {
		return super.toString() + "\nNombre: " + nombre + "\nApellidos: " + apellidos + "\nDNI: "+ dni + "\nUbicación: " + ubicacion+ "\nNúmero de la Seguridad Social: "
				+ numSeguridadSocial;
	}
 
}

Esto es lo que tengo yo de la creación de las clases normales (me faltan completar algunas cosas comola validacion del dni) yy tengo que acabar el programa principal que ejecute todo.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 19/05/2021 15:21:09
Has de revisar las relaciones de herencia que has puesto, no son correctas.

Una forma de saber si son correctas, es preguntarse uno mismo si tiene sentido en el "mundo real", ya que de hecho, la POO lo que pretende es modelar el mundo real.



1
public class Pasajeros extends Tren{

En el mundo real, ¿un pasajero es un tren?
No. Luego, esa herencia no tiene sentido.

Porque codificar eso significa que cada vez que construimos un Pasajero, estamos construyendo al mismo tiempo un Tren.
Fíjate que al construir un Pasajero, tienes que aportar a su constructor también un número de tren y unas cantidades de pasajeros..
Resulta que cada Pasajero será al mismo tiempo un Tren individualizado..., lo cuál es un sin sentido.

Un pasajero puede que vaya dentro de un tren, pero no significa que sea un tren

Lo mismo con Tripulante y Conductor, ninguno de ellos son trenes, no han de heredar de la clase Tren.


Las clases que yo veo aquí, tal y como está redactado el enunciado, son:

Viaje
Un Viaje se compone (componer no tiene nada que ver con heredar) de un conjunto de Pasajeros y de un Tren

Así que otra clase será Pasajero.
De los Pasajeros el enunciado distingue entre dos tipos: Turista y Business
Aquí si quisiéramos, podríamos hacer que Pasajero fuese una clase y que de ella heredasen las clases Turista y Business
¿Un Turista es un Pasajero? Sí, tiene sentido en el mundo real. Por tanto, se podría hacer y estaría bien hecho.

Sin embargo, en este enunciado, no hay absolutamente ninguna diferencia entre un Turista y un Business. Tienen los mismos atributos, los mismos métodos.., no hay siquiera nada sobre que paguen precios distintos (este ejercicio no trata sobre precios).

Puesto que son EXACTAMENTE iguales, no es necesario escribir clases diferentes. Insisto en que se podría hacer y sería correcto. Pero, para este ejercicio en concreto, es innecesario.
Parece más óptimo escribir solo una clase Pasajero y distinguir al Turista del Business simplemente con un atributo String. Tal vez se podría usar un ENUM (enumerado) para este atributo, pero si no lo has usado nunca, da igual, olvídalo y usa simplemente un String.

La otra clase de la que se compone un Viaje, es la clase Tren

Un Tren está compuesto por unos Tripulantes, de los que hay un Conductor y un máximo de 7 Trabajadores
Aquí, sí que hay posibles relaciones de herencia.

¿Un Tripulante es un Tren?
No. Herencia descartada.

- ¿Un Conductor es un Tripulante?
Sí. Posible herencia
- ¿Un Trabajador es un Tripulante?
Sí. La herencia es inminente...

Falta una cuestión importante:
- ¿Hay diferencias entre un Conductor y un Trabajador, a pesar de que ambos son Tripulantes?
, si las hay.

- Un Conductor tiene un atributo único, que es el número de conductor y no lo tienen los Trabajadores.

- Y un Trabajador tiene un atributo único, que es la ubicación (su puesto dentro del tren), atributo que no tienen los Conductores

En este caso, sí que tiene sentido hacer una relación de herencia.
La clase Tripulante (preferiblemente abstracta) tendría los atributos y métodos que son comúnes a todos los tripulantes.
De esta clase, heredarían luego Conductor y Trabajador, que cada uno aportará los atributos y métodos que son exclusivos de ellos.


Así que, recapitulando:

Hay que modelar un Viaje.

Un Viaje se compone de una colección de Pasajeros, guardados en un ArrayList por ejemplo, y de un Tren

Y un Tren está compuesto por una Tripulacion, de los cuáles podemos diferenciar dos tipos: Conductor y Trabajador
Hay un máximo de 7 Trabajadores, que pueden guardarse también en un ArrayList


Esas son las clases que yo detecto.
Y la única relación de herencia (extends) que tendría sentido es que Conductor y Trabajador, sean clases hijas de Tripulacion


Si lo que he explicado te parece que tiene sentido y que está bien, aplica los cambios a tu código para que se ajuste mejor a esto.
Si algo no lo ha entendido bien, o te genera dudas, pregunta y miro de explicarme mejor.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Victor (18 intervenciones) el 19/05/2021 16:27:03
Okey muchas gracias me has aclarado bastante más que antes. Intentaré que tal y te digo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Víctor (18 intervenciones) el 19/05/2021 17:45:34
Pues mira he conseguido hacer las clases creo que mas o menos bien aunque me faltan algunos detalles como: Un Viaje se compone de una colección de Pasajeros, guardados en un ArrayList por ejemplo, y de un Tren, un máximo de 7 Trabajadores, que pueden guardarse también en un ArrayList y la validacion del dni. No se si me podrias ayudar con eso...
Te muestro lo que he hecho:
************************************
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package tren;
 
public class Viaje {
 
	//Atributos
	private int numBillete;
	private String estacionOrigen;
	private String estacionDestino;
	private String fecha;
	private String horaSalida;
	private String horaLlegada;
	private String duracion;//del viaje
 
	//Constructor
	public Viaje (int numBillete, String estacionOrigen, String estacionDestino, String fecha, String horaSalida, String horaLlegada, String duracion) {
		this.numBillete=numBillete;
		this.estacionOrigen=estacionOrigen;
		this.fecha=fecha;
		this.horaSalida=horaSalida;
		this.horaLlegada=horaLlegada;
		this.duracion=duracion;
	}
 
	//Métodos
 
	/**
	 * @return the numBillete
	 */
	public int getNumBillete() {
		return numBillete;
	}
 
	/**
	 * @param numBillete the numBillete to set
	 */
	public void setNumBillete(int numBillete) {
		this.numBillete = numBillete;
	}
 
	/**
	 * @return the estacionOrigen
	 */
	public String getEstacionOrigen() {
		return estacionOrigen;
	}
 
	/**
	 * @param estacionOrigen the estacionOrigen to set
	 */
	public void setEstacionOrigen(String estacionOrigen) {
		this.estacionOrigen = estacionOrigen;
	}
 
	/**
	 * @return the estacionDestino
	 */
	public String getEstacionDestino() {
		return estacionDestino;
	}
 
	/**
	 * @param estacionDestino the estacionDestino to set
	 */
	public void setEstacionDestino(String estacionDestino) {
		this.estacionDestino = estacionDestino;
	}
 
	/**
	 * @return the fecha
	 */
	public String getFecha() {
		return fecha;
	}
 
	/**
	 * @param fecha the fecha to set
	 */
	public void setFecha(String fecha) {
		this.fecha = fecha;
	}
 
	/**
	 * @return the horaSalida
	 */
	public String getHoraSalida() {
		return horaSalida;
	}
 
	/**
	 * @param horaSalida the horaSalida to set
	 */
	public void setHoraSalida(String horaSalida) {
		this.horaSalida = horaSalida;
	}
 
	/**
	 * @return the horaLlegada
	 */
	public String getHoraLlegada() {
		return horaLlegada;
	}
 
	/**
	 * @param horaLlegada the horaLlegada to set
	 */
	public void setHoraLlegada(String horaLlegada) {
		this.horaLlegada = horaLlegada;
	}
 
	/**
	 * @return the duracion
	 */
	public String getDuracion() {
		return duracion;
	}
 
	/**
	 * @param duracion the duracion to set
	 */
	public void setDuracion(String duracion) {
		this.duracion = duracion;
	}
 
	@Override
	public String toString() {
		return "Número de billete: " + numBillete +"\nEstación de origen: " + estacionOrigen + "\nEstación de destino: " +  estacionDestino +
				"\nFecha: " + fecha + "\nHora de salida: " + horaSalida + "\nHora de llegada: " + horaLlegada + "\nDuración: " + duracion;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package tren;
 
public class Tren {
 
	//Atributos
	private int numTren;
	private String modelo;
	private int numPasajeroBusiness;
	private int numPasajeroTurista;
 
	//Constructor
	public Tren (int numTren, String modelo, int numPasajeroBusiness, int numPasajeroTurista) {
		this.numTren=numTren;
		this.modelo=modelo;
		this.numPasajeroBusiness=numPasajeroBusiness;
		this.numPasajeroTurista=numPasajeroTurista;
	}
 
	//Métodos
 
	/**
	 * @return the numTren
	 */
	public int getNumTren() {
		return numTren;
	}
 
	/**
	 * @param numTren the numTren to set
	 */
	public void setNumTren(int numTren) {
		this.numTren = numTren;
	}
 
	/**
	 * @return the modelo
	 */
	public String getModelo() {
		return modelo;
	}
 
	/**
	 * @param modelo the modelo to set
	 */
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	/**
	 * @return the numPasajeroBusiness
	 */
	public int getNumPasajeroBusiness() {
		return numPasajeroBusiness;
	}
 
	/**
	 * @param numPasajeroBusiness the numPasajeroBusiness to set
	 */
	public void setNumPasajeroBusiness(int numPasajeroBusiness) {
		this.numPasajeroBusiness = numPasajeroBusiness;
	}
 
	/**
	 * @return the numPasajeroTurista
	 */
	public int getNumPasajeroTurista() {
		return numPasajeroTurista;
	}
 
	/**
	 * @param numPasajeroTurista the numPasajeroTurista to set
	 */
	public void setNumPasajeroTurista(int numPasajeroTurista) {
		this.numPasajeroTurista = numPasajeroTurista;
	}
 
	@Override
	public String toString() {
		return "Número de tren: " + numTren + "\nModelo: " + modelo + "\nNúmero de pasajeros en clase business" + numPasajeroBusiness +
				"\nNúmero de pasajeros en clase turista: " + numPasajeroTurista;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package tren;
 
public class Pasajero {
 
	//Atributos
	private String nombre;
	private String apellidos;
	private String dni;
	private int numFidelizacionEmpresa;
	private Business business;
	private Turista turista;
 
	//Constructor
	public Pasajero (String nombre, String apellidos, String dni, int numFidelizacionEmpresa, Business business, Turista turista) {
		this.nombre=nombre;
		this.apellidos=apellidos;
		this.dni=dni;
		this.numFidelizacionEmpresa=numFidelizacionEmpresa;
		this.business=business;
		this.turista=turista;
	}
 
	//Métodos
 
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
 
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	/**
	 * @return the apellidos
	 */
	public String getApellidos() {
		return apellidos;
	}
 
	/**
	 * @param apellidos the apellidos to set
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}
 
	/**
	 * @param dni the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	/**
	 * @return the numFidelizacionEmpresa
	 */
	public int getNumFidelizacionEmpresa() {
		return numFidelizacionEmpresa;
	}
 
	/**
	 * @param numFidelizacionEmpresa the numFidelizacionEmpresa to set
	 */
	public void setNumFidelizacionEmpresa(int numFidelizacionEmpresa) {
		this.numFidelizacionEmpresa = numFidelizacionEmpresa;
	}
 
	/**
	 * @return the business
	 */
	public Business getBusiness() {
		return business;
	}
 
	/**
	 * @param business the business to set
	 */
	public void setBusiness(Business business) {
		this.business = business;
	}
 
	/**
	 * @return the turista
	 */
	public Turista getTripulante() {
		return turista;
	}
 
	/**
	 * @param turista the turista to set
	 */
	public void setTripulante(Turista tripulante) {
		this.turista = tripulante;
	}
 
	@Override
	public String toString() {
		return  "Nombre" + nombre + "\nApellidos: " + apellidos + "\nDNI: " + dni + "\nNúmero de fidelización de la empresa" + numFidelizacionEmpresa +
				"\nBusiness: " + business + "\nTurista: " + turista;
	}
 
}


1
2
3
4
5
package tren;
 
public enum Business {
	si, no
}


1
2
3
4
5
package tren;
 
public enum Turista {
	si, no
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package tren;
 
public class Tripulante {
 
	//Atributos
	private String nombre;
	private String apellidos;
	private String dni;
	private int numSeguridadSocial;
 
	//Constructor
	public Tripulante (String nombre, String apellidos, String dni, int numSeguridadSocial) {
		this.nombre=nombre;
		this.apellidos=apellidos;
		this.dni=dni;
		this.numSeguridadSocial=numSeguridadSocial;
	}
 
	//Métodos
 
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
 
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	/**
	 * @return the apellidos
	 */
	public String getApellidos() {
		return apellidos;
	}
 
	/**
	 * @param apellidos the apellidos to set
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	/**
	 * @return the dni
	 */
	public String getDni() {
		return dni;
	}
 
	/**
	 * @param dni the dni to set
	 */
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	/**
	 * @return the numSeguridadSocial
	 */
	public int getNumSeguridadSocial() {
		return numSeguridadSocial;
	}
 
	/**
	 * @param numSeguridadSocial the numSeguridadSocial to set
	 */
	public void setNumSeguridadSocial(int numSeguridadSocial) {
		this.numSeguridadSocial = numSeguridadSocial;
	}
 
	@Override
	public String toString() {
		return "Nombre: " + nombre + "\nApellidos: " + apellidos + "\nDNI: " + dni + "\nNúmero de la Seguridad Social: " + numSeguridadSocial;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package tren;
 
public class Conductor extends Tripulante{
 
	//Atributos
	private int numConductor;
 
	//Constructor
	public Conductor (String nombre, String apellidos, String dni, int numSeguridadSocial, int numConductor) {
		super(nombre, apellidos, dni, numSeguridadSocial);
		this.numConductor=numConductor;
	}
 
	//Métodos
 
	/**
	 * @return the numConductor
	 */
	public int getNumConductor() {
		return numConductor;
	}
 
	/**
	 * @param numConductor the numConductor to set
	 */
	public void setNumConductor(int numConductor) {
		this.numConductor = numConductor;
	}
 
	@Override
	public String toString() {
		return super.toString() + "\nNúmero de conductor" + numConductor;
	}
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package tren;
 
public class Trabajador extends Tripulante{
 
	//Atributos
	private String ubicacion;
 
	//Constructor
	public Trabajador (String nombre, String apellidos, String dni, int numSeguridadSocial, String ubicacion) {
		super(nombre, apellidos, dni, numSeguridadSocial);
		this.ubicacion=ubicacion;
	}
 
	//Métodos
 
	/**
	 * @return the ubicacion
	 */
	public String getUbicacion() {
		return ubicacion;
	}
 
	/**
	 * @param ubicacion the ubicacion to set
	 */
	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}
 
	@Override
	public String toString() {
		return super.toString() + "\nUbicación" + ubicacion;
	}
 
}

No se que te parece.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 20/05/2021 01:04:50
Mmhhh.
La entidad Viaje no es así como se debe interpretar.
Por ejemplo, no va a tener como atributo ningún número de billete. En otro contexto sí podría tener sentido.
Si por ejemplo dijéramos que los Pasajeros compran Viajes, entonces sí.

Pero en este ejercicio, el contexto es distinto. Aquí un Viaje no es algo que compran los Pasajeros.
Un Viaje consiste en un trayecto (de hecho, quizá el nombre de Trayecto hubiera sido más acertado) que se hace entre dos estaciones, con unas fechas y hora de salida/llegada concretas, que lo realizará un Tren (con su Tripulación) y donde viajarán una cantidad de Pasajeros.

Esto lo podemos discernir si analizamos bien lo que dice el enunciado:

1
2
3
4
5
6
7
8
9
- Se identifica como viaje:
 
- Un conjunto de pasajeros indicando los siguientes datos: nombre, apellidos, dni y número de billete.
 
- El tren correspondiente (con todos sus datos) y la tripulación completa indicando conductor y resto de tripulantes.
 
- Estación de origen y estación de destino, fecha y hora de salida y de llegada y una duración en minutos del viaje.
 
- Los pasajeros dentro del viaje correspondiente estarán ordenados por dni. Y deberá haber un método que permita obtener todos los datos del pasajeros a partir de dicho DNI.

Fíjate que ahí en ningún momento dice que un Viaje tenga un número de billete.

Sí dice (en otro párrafo distinto) que los Pasajeros tienen como atributo un número de billete, pero este no tiene ninguna relación con la entidad/clase Viaje.

Luego, para el tema de Business o Turista, has usado enum, pero no de la mejor forma.
Usas dos enum para cada tipo de Pasajero, que alternan entre si o no. Para hacerlo así, mejor haber usado dos boolean que alternan entre true o false.
Pero de todos modos, es más eficiente usar un solo enum, que alterne entre Turista o Business. Así queda más claro y no hay posibilidad de inconsistencias, o es uno o es otro.
Si se usan dos (ya sean boolean o enum), se abre la posibilidad de que por error (suponiendo que fuera un programa para el mundo real) se marquen ambos atributos como true/si, o ambos como false/no.

Que no sería culpa del programa, sería culpa del humano que haya hecho la reserva a ese Pasajero y estaba tan despistado que marcó mal esos atributos.
Pero como programadores, a la hora de diseñar el código, conviene hacerlo de manera que se reduzcan las posibilidades de que luego un humano meta la pata cuando use nuestro programa.

Por eso mejor un enum que alterne únicamente entre los valores posibles. Que entonces el humano también puede equivocarse y marcar como Business a un Turista, o viceversa.
Esto podría provocar que el Pasajero pague de más o de menos, porque el programa le aplicará la tarifa equivocada. Pero bueno, ya reclamará.

Mejor eso, que no dejar la puerta abierta que se marque a un Pasajero como Turista y Business a la vez, o ninguno de los dos. Entonces el programa (supuesto programa aplicado en un mundo real) podría directamente bloquearse al encontrarse con esas inconsistencias.



Mira, te voy a mostrar como he escrito yo las clases.

Primero, la clase Tripulante.
Yo la he declarado como abstracta. Esto no es obligatorio, y de hecho, va a funcionar igual si es abstracta o no.
Pero al declararla como abstracta, estamos indicando que NO queremos permitir que se puedan crear objetos Tripulante
Queremos que en el programa se puedan crear objetos Conductor y objetos Trabajador, tiene que ser uno de estos dos tipos. Un "simple" Tripulante no lo consideramos adecuado.

De este modo, si otro programador ha de usar nuestras clases escritas por nosotros para crear otros programas, cuando vea que una clase es abstracta, ya sabe que esa entidad no está pensada para crear objetos a partir de ella, si no para que otras clases hereden de ella.

Bueno, este sería el código para Tripulante.
Fíjate que el método para setear el DNI, ya está diseñado para lanzar una Excepción en el caso de que el DNI no tenga 9 caracteres.
Dicho método lo uso también en el constructor, así que, por herencia, será imposible crear un Conductor o un Trabajador si el DNI no tienen 9 caracteres.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public abstract class Tripulante {
 
	protected String nombre;
	protected String apellidos;
	protected String dni;
	protected String numSS;
 
	public Tripulante(String nombre, String apellidos, String dni, String numSS) throws Exception{
		this.nombre = nombre;
		this.apellidos = apellidos;
		setDni(dni); //Si longitud no es correcta lanzará excepción
		this.numSS = numSS;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getApellidos() {
		return apellidos;
	}
 
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	public String getDni() {
		return dni;
	}
 
	public void setDni(String dni) throws Exception {
		if (dni.length() != 9)
			throw new Exception("El DNI del Tripulante ha de tener 9 caracteres");
		else
			this.dni = dni;
	}
 
	public String getNumSS() {
		return numSS;
	}
 
	public void setNumSS(String numSS) {
		this.numSS = numSS;
	}
 
	@Override
	public String toString() {
		return String.format("Nombre: %s\nApellidos: %s\nDNI: %s\nNum. SS: %s",
				nombre, apellidos, dni, numSS);
	}
}

De esta clase, como ya hemos dicho, van a heredar Conductor y Trabajador.
Sus constructores han de indicar también la instrucción "throws Exception".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public final class Conductor extends Tripulante{
 
	private String numConductor;
 
	public Conductor(String nombre, String apellidos, String dni, String numSS,
			String numConductor) throws Exception {
		super(nombre, apellidos, dni, numSS);
		this.numConductor = numConductor;
	}
 
	public String getNumConductor() {
		return numConductor;
	}
 
	public void setNumConductor(String numConductor) {
		this.numConductor = numConductor;
	}
 
	@Override
	public String toString() {
		return String.format("%s\nNum. Conductor: %s", super.toString(), numConductor);
	}
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public final class Trabajador extends Tripulante{
 
	private String ubicacion;
 
	public Trabajador(String nombre, String apellidos, String dni, String numSS,
			String ubicacion) throws Exception {
		super(nombre, apellidos, dni, numSS);
		this.ubicacion = ubicacion;
	}
 
	public String getUbicacion() {
		return ubicacion;
	}
 
	public void setUbicacion(String ubicacion) {
		this.ubicacion = ubicacion;
	}
 
	@Override
	public String toString() {
		return String.format("%s\nUbicacion: %s", super.toString(), ubicacion);
	}
 
}

Continuo en el siguiente post...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 20/05/2021 01:06:11
Pasemos ahora a la clase Tren.
Recordemos que entre sus atributos, va a tener UN Conductor y un conjunto de Trabajadores, máximo 7.
Los Trabajadores NO los voy a indicar por el constructor.
Una vez creado el objeto Tren, habrá que añadir Trabajadores mediante un método que retorna un boolean. Este método se encarga de controlar que haya un máximo de 7 trabajadores, así que retornará false cuando se intente superar este límite.

El número de "turistas" y "business" tampoco lo indicaremos en el constructor. Estos valore se setearán luego cuando se hayan decidido la lista de Pasajeros para el Viaje.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public final class Tren {
 
	private String modelo;
	private String numero;
	private int turistas;
	private int business;
	private Conductor conductor;
	private ArrayList<Trabajador> trabajadores;
 
	public Tren(String modelo, String numero, Conductor conductor) {
		this.modelo = modelo;
		this.numero = numero;
		turistas = 0;
		business = 0;
		this.conductor = conductor;
		trabajadores = new ArrayList<Trabajador>(7);
	}
 
	public String getModelo() {
		return modelo;
	}
 
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
 
	public String getNumero() {
		return numero;
	}
 
	public void setNumero(String numero) {
		this.numero = numero;
	}
 
	public int getTuristas() {
		return turistas;
	}
 
	public void setTuristas(int turistas) {
		this.turistas = turistas;
	}
 
	public int getBusiness() {
		return business;
	}
 
	public void setBusiness(int business) {
		this.business = business;
	}
 
	public Conductor getConductor() {
		return conductor;
	}
 
	public void setConductor(Conductor conductor) {
		this.conductor = conductor;
	}
 
	public boolean agregarTrabajador(Trabajador trab) {
		if (trabajadores.size() == 7) {
			System.out.println("No se pueden agregar más trabajadores.");
			return false;
		}
		else
			return trabajadores.add(trab);
	}
 
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("\t-- Datos del Tren --");
		sb.append("\nModelo: " + modelo);
		sb.append("\nNº Tren: " + numero);
		sb.append("\nParajeros Turistas: " + turistas);
		sb.append("\nParajeros Business: " + business);
		sb.append("\n\t-- Datos del Conductor --\n");
		sb.append(conductor);
		sb.append("\n\t-- Datos de los Trabajadores --\n");
		for (Trabajador trab: trabajadores)
			sb.append(String.format("%s\n\t----------------------\n", trab));
 
		return sb.toString();
	}
 
}


Vamos ahora con los Pasajeros.
Entre sus atributos, como ya hemos comentado, hay que indicar en que "clase" van a viajar: Turista o Business.
Esto se podría resolver con un simple String y punto.
Pero usa un enum es más adecuado.

Dicho enum, podría ser tan simple y sencillo como esto:
1
2
3
4
5
public enum Clase {
 
	TURISTA, BUSINESS
 
}
Si respetamos las convenciones de Java, esos valores se han de escribir en mayúscula porque son constantes, no son objetos variables.
Esto implica que luego al mostrar la información de los Pasajeros en pantalla, esos valores también saldrán en mayúscula.
Como es un ejercicio de aprendizaje, pues la verdad es que esto daría igual. La estética es lo de menos.

Pero si queremos, podemos hacer un enum un poco más elaborado, haciendo que los valores de ese enum, tengan un atributo String que contenga el texto tal y como queremos que se vea en pantalla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum Clase {
 
	TURISTA("Turista"), BUSINESS("Business");
 
	private String nombreClase;
 
	private Clase(String nombre) {
		nombreClase = nombre;
	}
 
	@Override
	public String toString() {
		return nombreClase;
	}
}


Con cualquiera de estos dos enum, ya podemos escribir la clase Pasajero.
Para esta clase, hay que destacar dos cosas:

1 - Aunque el enunciado no lo especifica, también le he añadido lo de lanzar una Excepción si el DNI no tiene 9 caracteres.

2 - El enunciado sí especifica que la lista de Pasajeros ha de estar ordenada por el atributo DNI.
Para conseguir esta ordenación, se podría hacer luego en el programa principal, mediante el "método de la burbuja" o algún algoritmo similar.
Pero ya que estamos trabajando con POO, lo ideal es que hagamos que la clase Pasajero sepa cómo tiene que compararse con otros objetos Pasajero para conseguir ordenarse por DNI.

Para esto, lo que hacemos es que esta clase implemente la interfaz Comparable. Al implementar esta interfaz, automáticamente se añade un método llamado compareTo(), que deberemos sobreescribir (Override) para indicar como queremos que se comparen los objetos Pasajero para determinar cuál es menor y cuál es mayor (cuál va delante y cuál detrás al ordenar).

Queremos que se ordenen por el atributo DNI, este atributo es un String, y la clase String ya trae de serie su propio método compareTo(). Así que cuando haya que comparar dos Pasajeros, simplemente vamos a retornar el resultado de comparar sus atributos DNI.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public final class Pasajero implements Comparable<Pasajero>{
 
	private String nombre;
	private String apellidos;
	private String dni;
	private String numBillete;
	private String numFideliz;
	private Clase clase;
 
	public Pasajero(String nombre, String apellidos, String dni, String numBillete,
			String numFideliz, Clase clase) throws Exception {
		this.nombre = nombre;
		this.apellidos = apellidos;
		setDni(dni); //Si longitud no es correcta lanzará excepción
		this.numBillete = numBillete;
		this.numFideliz = numFideliz;
		this.clase = clase;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getApellidos() {
		return apellidos;
	}
 
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}
 
	public String getDni() {
		return dni;
	}
 
	public void setDni(String dni) throws Exception {
		if (dni.length() != 9)
			throw new Exception("El DNI del Pasajero ha de tener 9 caracteres");
		else
			this.dni = dni;
	}
 
	public String getNumBillete() {
		return numBillete;
	}
 
	public void setNumBillete(String numBillete) {
		this.numBillete = numBillete;
	}
 
	public String getNumFideliz() {
		return numFideliz;
	}
 
	public void setNumFideliz(String numFideliz) {
		this.numFideliz = numFideliz;
	}
 
	@Override
	public String toString() {
		return String.format("Nombre: %s\nApellidos: %s\nDNI: %s\nClase: %s\nNº Billete: %s\n"
				+ "Nº Fidelizacion: %s", nombre, apellidos, dni, clase,
				numBillete, numFideliz==null?"No tiene":numFideliz);
	}
 
	@Override
	public int compareTo(Pasajero otroPasajero) {
		return dni.compareTo(otroPasajero.dni);
	}
 
}

Lo más ventajoso de usar la interfaz Comparable es que, como luego veremos, con una sola instrucción podemos pedirle al ArrayList con la lista de Pasajeros que se ordene el solito.
Sin bucles, ni algoritmos, ni complicaciones. El ArrayList automáticamente comparará sus elementos y los ordenará según lo que diga el compareTo() de dichos elementos.

Continuo abajo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 20/05/2021 01:06:29
Ahora toca la clase Viaje, que es la que engloba todas las demás clases.
Entre sus atributos tiene una lista de Pasajeros (un ArrayList), un Tren y otros datos como origen, destino, fecha de salida, llegada,...

Los Pasajeros no se los indicaremos mediante el constructor. Se podría, pero en lugar de pasar un ArrayList como argumento, prefiero crear un Viaje con el resto de atributos y luego usar un método para ir añadiendo Pasajeros uno a uno.

Fíjate que en el método de agregarPasajero(), tras añadir un nuevo pasajero le pido al ArrayList que se ordene mediante el método sort().
Y le paso un valor null a este método.
El método sort() se encarga de ordenar el ArrayList y si queremos, podemos pasarle un objeto Comparator con las reglas que se han de seguir para ordenar los elementos.
Si en lugar de eso le pasamos valor null, entonces aplicará las reglas que indiquen los propios elementos. Por esto nos convenía que Pasajero implementase la interfaz Comparable, porque así el ArrayList ya sabe como hay que ordenar.

A parte de esto, en esta clase incluyo dos métodos importantes.
Uno es para poder consultar un Pasajero mediante un DNI, tal y como pide el enunciado

El otro, es para listar todos los Pasajeros en pantalla. Esto no lo pide el enunciado, pero es interesante disponer de él para luego probar el programa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public final class Viaje {
 
	private ArrayList<Pasajero> pasajeros;
	private Tren tren;
	private String origen;
	private String destino;
	private String salida;
	private String llegada;
	private int duracion; //En minutos
 
	public Viaje(Tren tren, String origen, String destino, String salida, String llegada, int duracion) {
		pasajeros = new ArrayList<Pasajero>();
		this.tren = tren;
		this.origen = origen;
		this.destino = destino;
		this.salida = salida;
		this.llegada = llegada;
		this.duracion = duracion;
	}
 
	public Tren getTren() {
		return tren;
	}
 
	public void setTren(Tren tren) {
		this.tren = tren;
	}
 
	public String getOrigen() {
		return origen;
	}
 
	public void setOrigen(String origen) {
		this.origen = origen;
	}
 
	public String getDestino() {
		return destino;
	}
 
	public void setDestino(String destino) {
		this.destino = destino;
	}
 
	public String getSalida() {
		return salida;
	}
 
	public void setSalida(String salida) {
		this.salida = salida;
	}
 
	public String getLlegada() {
		return llegada;
	}
 
	public void setLlegada(String llegada) {
		this.llegada = llegada;
	}
 
	public int getDuracion() {
		return duracion;
	}
 
	public void setDuracion(int duracion) {
		this.duracion = duracion;
	}
 
	public void agregarPasajero(Pasajero pasaj) {
		pasajeros.add(pasaj);
		//Cada vez que se añade un pasajero, pedimos que se ordene el listado.
		pasajeros.sort(null);
		//Los pasajeros se ordenarán por dni, así está establecido en clase Pasajero mediante compareTo()
	}
 
	public String consultarPasajero(String dni) {
 
		if (pasajeros.isEmpty())
			return "No hay Pasajeros registrados";
		else
			for (Pasajero pasaj: pasajeros)
				if (pasaj.getDni().equals(dni))
					return pasaj.toString();
		//Si hay Pasajeros pero el bucle no encuentra el DNI, es que no existe este Pasajero
		return "No existe Pasajero con DNI: " + dni;
	}
 
	public void listarPasajeros() {
		System.out.println("\n\tListado de Pasajeros");
		System.out.println("\t------- -- ---------\n");
		if (pasajeros.isEmpty())
			System.out.println("No hay Pasajeros registrados");
		else
			for (Pasajero pasaj: pasajeros) {
				System.out.println(pasaj);
				System.out.println("\t----------------------");
			}
 
		System.out.println();
	}
 
	@Override
	public String toString() {
		return String.format("Origen: %s\nDestino: %s\nSalida: %s\nLlegada: %s\nDuracion: %d minutos\n"
				+ "Tren: %s\nPasajeros: %d", origen, destino, salida, llegada, duracion,
				tren.getNumero(), pasajeros.size());
	}
}


Pues ya lo tenemos todos. Ahora habría que hacer un programa donde se construya un Viaje con las propiedades que pide el enunciado y ofrecer un menu simple, que nos permita ver la información del Viaje, la información del Tren y listar los Pasajeros y consultarlos por DNI.

Fíjate que al construir el Viaje, hay que construir también Pasajeros, un Conductor y unos Trabajadores. Y los objetos de estas clases están programadas para lanzar una Excepción si sus DNI no tienen 9 caracteres.
Por tanto, esto nos va a obligar a usar try catch para capturar esta posible Excepción.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class TestViajeTren {
 
	private static Scanner teclado = new Scanner(System.in);
	private static Viaje viaje;
 
	public static void main(String[] args) {
 
		try {
			construirViaje();
			int opcion = 0;
 
			do {
				System.out.println("\n\tMENU GESTION VIAJE");
				System.out.println("\t---- ------- -----\n");
				System.out.println("(1) - Mostrar datos del Viaje");
				System.out.println("(2) - Mostrar datos del Tren");
				System.out.println("(3) - Listar todos los Pasajeros");
				System.out.println("(4) - Consultar Pasajero por DNI");
				System.out.println("(5) - TERMINAR PROGRAMA");
				System.out.print("Elija opcion: ");
				opcion = Integer.parseInt(teclado.nextLine());
 
				switch(opcion) {
				case 1:
					System.out.println("\n\tDatos del Viaje");
					System.out.println("\t----- --- -----");
					System.out.println(viaje);
					break;
				case 2:
					System.out.println("\n\tDatos del Tren");
					System.out.println("\t----- --- ----");
					System.out.println(viaje.getTren());
					break;
				case 3:
					viaje.listarPasajeros();
					break;
				case 4:
					System.out.println("\n\tConsultar por DNI");
					System.out.println("\t--------- --- ---");
					System.out.print("DNI: ");
					String dni = teclado.nextLine();
					System.out.println("\nDatos del Pasajero:");
					System.out.println(viaje.consultarPasajero(dni));
					break;
				case 5:
					System.out.println("\n\t\tFIN DE PROGRAMA");
					break;
				default:
					System.out.println("\nOpción equivocada\n");
				}
			} while(opcion != 5);
 
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.out.println("No ha sido posible construir el Viaje");
			System.out.println("\n\t\tFIN DE PROGRAMA");
		}
 
 
	}
 
	private static void construirViaje() throws Exception {
 
		/*
		 * Construimos Tren y Conductor.
		 * Agregamos Tripulantes
		 * Posible excepcion por DNI erroneo
		 */
		Tren tren = new Tren("S-100", "AVE 100-018",
				new Conductor("Sara", "Pelaez", "DNI000100", "45678902", "COND005"));
 
		tren.agregarTrabajador(new Trabajador("Ramon", "Reyes", "DNI000101", "62510926", "Cafeteria"));
		tren.agregarTrabajador(new Trabajador("Luis", "Rego", "DNI000102", "58902098", "Locomotora"));
 
		//Construimos Viaje
		viaje = new Viaje(tren, "Madrid", "Cordoba", "19/5/2021 08:00", "19/5/2021 11:15", 195);
 
		//Agregamos pasajeros. Posible excepcion por DNI erroneo
 
		viaje.agregarPasajero(
				new Pasajero("Pablo", "Herrera", "DNI000308", "BILL00456", "FID0023", Clase.BUSINESS));
		viaje.agregarPasajero(
				new Pasajero("Laura", "Juan", "DNI000303", "BILL00409", null, Clase.BUSINESS));
		viaje.agregarPasajero(
				new Pasajero("Enrique", "Lopez", "DNI000205", "BILL00423", "FID0099", Clase.BUSINESS));
		viaje.agregarPasajero(
				new Pasajero("Gemma", "Flores", "DNI000411", "BILL00476", "FID0016", Clase.TURISTA));
		viaje.agregarPasajero(
				new Pasajero("Jorge", "Morales", "DNI000301", "BILL00421", null, Clase.TURISTA));
 
		tren.setTuristas(2);
		tren.setBusiness(3);
	}
 
}

Y bueno, con esto ya estaría todo funcionando.

Repásalo a fondo, asegúrate de que entiendes cada línea de código.
Cualquier cosa que no entiendas, o no estés de acuerdo, o lo que sea... por favor no dudes en comentarlo por aquí.

Esta no es la única solución, ni tampoco tiene por qué ser la mejor. Solo es una forma de hacerlo.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Victor (18 intervenciones) el 20/05/2021 21:14:13
Muchísimas gracias Kabuto ya me compila genial y funciona a la perfección el programa. A penas he cambiado algunas cosas para adaptarlo a mi forma de organizarme en cuanto a código se refiere. Lo importante de todo esto es que te estoy muy agradecido porque he aprendido mucho con tú ayuda y me ha venido genial todo esto.
No te molesto mas<3.
Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO tren

Publicado por Kabuto (1381 intervenciones) el 21/05/2021 11:28:40
Me alegro.

Al principio cuesta un poco identificar las clases y cuáles serán las relaciones más adecuadas entre ellas.

En cuanto a las relaciones de herencia, la clave es entender que cuando una clase hereda de otra, estamos diciendo que son la misma cosa.
Y tenemos que pararnos a pensar si eso tiene sentido o no.

Por ejemplo, supongamos que tenemos la clase Coche y la clase Rueda. Sin duda hay una relación entre ellas, porque un Coche tiene 4 Ruedas.
¿Podría ser herencia?

¿Tiene sentido si decimos que una Rueda es un Coche?

No, no lo tiene. Son entidades distintas. Si aceptamos la herencia, al crear un Coche con cuatro Ruedas, por cada Rueda estaríamos creando a su vez otro Coche.
Es decir, estaremos creando un Coche que tiene otros cuatro Coches funcionando como Ruedas
Es un sin sentido, tanto en el mundo real, como en el propio código, porque nos encontraremos que al construir Ruedas, hay que pasarles una matricula porque hemos dicho que una Rueda es un Coche.
Y ojo, porque un Coche siempre va a tener cuatro Ruedas.
Así que cada Rueda es un Coche, que tiene sus propias cuatro Ruedas, que también con Coches, así que cada una tiene a su vez otras cuatro Ruedas, que también son Coches con cuatro Ruedas, que....

Menudo engendro estaríamos creando....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Coche {
 
   private String matricula;
   //Un coche tiene 4 Ruedas
   private Rueda rueda1;
   private Rueda rueda2;
   private Rueda rueda3;
   private Rueda rueda4;
 
   public Coche(String matricula) {
      this.matricula = matricula;
      //Cada Rueda hereda de Coche, así que requiere una matricula para ser construida
      rueda1 = new Rueda(matricula);
      rueda2 = new Rueda(matricula);
      rueda3 = new Rueda(matricula);
      rueda4 = new Rueda(matricula);
   }
}
 
public class Rueda extends Coche {
 
   //Al heredar de Coche, aunque Rueda no tenga atributos, su constructor nos va a exigir una matricula
   public Rueda(String matricula) {
      super(matricula); //Al construir esta Rueda, construimos también un Coche, que va a tener sus propias cuatro Ruedas
   }
}


Es un sin sentido.

Una Rueda NO es un Coche.

Un Coche TIENE Ruedas
Cuando la lógica nos dice que una clase tiene/incorpora a otra, entonces la relación no es herencia, es una relación de composición.

Y para codificar esta relación no se necesita instrucciones como extends ni nada parecido. Basta con declarar una clase, como atributo de la otra.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Coche {
 
   private String matricula;
   //Un coche tiene 4 Ruedas
   private Rueda rueda1;
   private Rueda rueda2;
   private Rueda rueda3;
   private Rueda rueda4;
 
   public Coche(String matricula) {
      this.matricula = matricula;
      //Las Ruedas no heredan de Coche, no requieren matricula para ser creadas
      rueda1 = new Rueda(matricula);
      rueda2 = new Rueda(matricula);
      rueda3 = new Rueda(matricula);
      rueda4 = new Rueda(matricula);
   }
}
 
public class Rueda extends Coche {
 
   //Rueda es una entidad propia e independiente de Coche
   public Rueda(String matricula) {
      super(matricula); //No requiere llamar al constructor de ninguna "super clase"
   }
}


Y bueno, siguiendo esta lógica, es más fácil discernir las relaciones entre clases.
Esto es un ejemplo y no siempre vamos a trabajar con entidades que son tan evidentes (todo el mundo sabe que una Rueda no es un Coche), pero las preguntas que debemos hacernos serán las mismas.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar