Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Kabuto

Páginas: 1 ... 8 9 10 11 12 [13] 14 15 16 17 18 ... 50
241
OK, a ver, para meternos en contexto.
Esta podría ser la clase Empleado
Código: [Seleccionar]
public abstract class Empleado {

private String documento;
private String nombre;
private double sueldoHora;

public Empleado() {
documento = "";
nombre = "";
sueldoHora = 0d;
}

public Empleado(String documento, String nombre, double sueldoHora) {
this.documento = documento;
this.nombre = nombre;
this.sueldoHora = sueldoHora;
}

public String getDocumento() {
return documento;
}

public void setDocumento(String documento) {
this.documento = documento;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public double getSueldoHora() {
return sueldoHora;
}

public void setSueldoHora(double sueldoHora) {
this.sueldoHora = sueldoHora;
}

@Override
public String toString() {
return String.format("documento=%s, nombre=%s, sueldoHora=%s", documento, nombre, sueldoHora);
}

}

Estas serían sus clases hijas. Nótese que sus métodos toString() se combinan con el toString() de la clase madre para mostrar la información adaptada a cada subclase.
Desarrollador
Código: [Seleccionar]
public class Desarrollador extends Empleado {

public Desarrollador() {
super();
}

public Desarrollador(String documento, String nombre, double sueldoHora) {
super(documento, nombre, sueldoHora);
}

@Override
public String toString() {
return String.format("Desarrollador [%s]", super.toString());
}

}

GestorProyectos
Código: [Seleccionar]
public class GestorProyectos extends Empleado {

private String area;

public GestorProyectos() {
super();
area = "";
}

public GestorProyectos(String documento, String nombre, double sueldoHora, String area) {
super(documento, nombre, sueldoHora);
this.area = area;
}

public String getArea() {
return area;
}

public void setArea(String area) {
this.area = area;
}

@Override
public String toString() {
return String.format("GestorProyectos [%s, area=%s]", super.toString(), area);
}

}

Admin
Código: [Seleccionar]
public class Admin extends Empleado {

public Admin() {
super();
}

public Admin(String documento, String nombre, double sueldoHora) {
super(documento, nombre, sueldoHora);
}

@Override
public String toString() {
return String.format("Admin [%s]", super.toString());
}

}

Esta sería la clase Empresa, a la cuál además de los atributos mencionados en el enunciado, le he añadido un ArrayList para guardar los Empleados que trabajarán para la Empresa.
Es necesario relacionar un empleado con una empresa y creo que la mejor forma es que cada empresa creada, tenga su propio ArrayList donde guardar los empleados que trabajan para ella.

Código: [Seleccionar]
import java.util.ArrayList;

public abstract class Empresa {

private String nit;
private String nombre;
private String direccion;
private String ciudad;
private ArrayList<Empleado> empleados;

public Empresa() {
nit = "";
nombre = "";
direccion = "";
ciudad = "";
empleados = new ArrayList<Empleado>();
}

public Empresa(String nit, String nombre, String direccion, String ciudad) {
this.nit = nit;
this.nombre = nombre;
this.direccion = direccion;
this.ciudad = ciudad;
empleados = new ArrayList<Empleado>();
}

public String getNit() {
return nit;
}

public void setNit(String nit) {
this.nit = nit;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getDireccion() {
return direccion;
}

public void setDireccion(String direccion) {
this.direccion = direccion;
}

public String getCiudad() {
return ciudad;
}

public void setCiudad(String ciudad) {
this.ciudad = ciudad;
}

public void asignarEmpleado(Empleado emp) {
empleados.add(emp);
}

public int contarEmpleados() {
return empleados.size();
}

@Override
public String toString() {
return String.format("nit=%s, nombre=%s, direccion=%s, ciudad=%s", nit, nombre, direccion, ciudad);
}

}

Y su clase hija EmpresaDesarrollo
Código: [Seleccionar]
public class EmpresaDesarrollo extends Empresa {

public EmpresaDesarrollo() {
super();
}

public EmpresaDesarrollo(String nit, String nombre, String direccion, String ciudad) {
super(nit, nombre, direccion, ciudad);
}

@Override
public String toString() {
return String.format("EmpresaDesarrollo [%s]", super.toString());
}

}


Hasta aquí tenemos digamos la "parte fácil".
Haremos un programa donde crear empresas, crear empleados que trabajarán en esas empresas y poder hacer algunas operaciones con estas entidades.

Bien, esas operaciones nos dicen que se han de hacer mediante otras dos clases, las cuáles han de implementar sendas interfaces en las que se declararán los métodos que realizarán esas operaciones.
Lo vemos en el próximo mensaje..

242
¿Cuál es tu confusión?
¿Has escrito al menos las clases básicas como Empleado o Empresa?

Especifica en que parte te atascas y/o muestra el código que tengas hecho y te ayudamos a corregirlo y a continuar a partir de él.

243
Perfecto.

Aunque quiero comentar algo, por si en el futuro te encontrases con un caso distinto.

Esta línea que has puesto, es totalmente correcta y perfecta:
Código: [Seleccionar]
System.out.println ("el doble del número introducido es: " + 2 * Integer.parseInt(entradaUsuario));
Pero, supongamos que en lugar de multiplicar * 2, te piden que le sumes + 2:

Código: [Seleccionar]
System.out.println ("Sumar 2 al numero introducido da el resultado: " + 2 + Integer.parseInt(entradaUsuario));
Si probamos con esa línea, veremos que no se hace ninguna suma aritmética, si no que el 2 se concatena con el otro número.
El operador +  sirve para sumar números, pero también para concatenar Strings. Y Java no puede adivinar cuál es nuestra intención, así que si se encuentra al menos un String en la expresión, los tratará a todos como Strings y hará concatenación

En el primer ejemplo esto no pasaba, porque el operador * es estrictamente aritmético así que no hay dudas de que es una multiplicación.

Pero cuando se trata de sumar, puede haber ambigüedad y la preferencia de Java será concatenar.

Esta ambigüedad podemos evitarla encerrando entre paréntesis la parte de la expresión que queremos que se sume:
Código: [Seleccionar]
System.out.println ("Sumar 2 al numero introducido da el resultado: " + [b](2 + Integer.parseInt(entradaUsuario))[/b]);Al hacer eso, le decimos a Java que lo hay entre paréntesis, es una expresión en si misma y ha de ser evaluada al margen de todo lo demás.
El resultado que de esa expresión, ya sí luego se evaluará con el resto de elementos de la "expresión principal"

Esto lo comento solo por si en algún momento te encontrase con un caso como este y te encontrases con que logras hacer la suma porque Java se empeña en concatenar.
Ahora ya sabes el motivo y como solucionarlo.

Un saludo.

244
Pintan bien.

Solo comentar un detalle poco importante.
Al registrar nuevo libro, pides un boolean para indicar la disponibilidad del libro:
Citar
    public static void registrarLibro(){
        sc.nextLine();
        System.out.println("CREAR LIBRO.");
        System.out.print("Código: ");
        String codigo=sc.nextLine();
        System.out.print("Título: ");
        String titulo=sc.nextLine();
        System.out.print("Autoría: ");
        String autoria=sc.nextLine();
        System.out.print("Disponibilidad: ");
        boolean disponibilidad=sc.nextBoolean();

Quizás no debiera ser necesario pedir ese dato ya que al registrar un libro, es decir, añadir un nuevo título a la biblioteca, se entiende que SÍ está disponible porque aún no ha habido ocasión de prestarlo.

Al añadir el libro, lo lógico sería considerar como TRUE su disponibilidad, la cuál solo debiera pasar a FALSE en el momento que se haga un nuevo préstamo.

Pero bueno, como digo, es un detalle de escasa relevancia.

Un saludo.


245
Si no indicas qué errores son y cómo es tu código..., pues poco puedo ayudar.

Puedo comenzar un menú con interfaz gráfica, para que sirva de guía y ver en qué estás fallando, o bien que sirva de ejemplo para que lo continúes y lo completes.

No va a ser muy elaborado porque mi tiempo libre es limitado.
Podemos crear un JFrame principal con botones para acceder a los submenús de las entidades que tenga nuestro programa.
En mi caso tengo 4, porque estoy reutilizando las clases que puse anteriormente



Al pinchar en uno de los botones, podemos hacer que aparezca un JDialog para la gestión de cada elemento.
Aquí por ejemplo gestiono Socios con todas las opciones CRUD necesarias.

Con el JComboBox puedo seleccionar Socios escogiendo su Número de Socio que lo identifica.
Cada vez que elijo uno, se muestran el resto de datos en pantalla.
Con los botones de abajo, puedo crear, modificar, eliminar y guardar


Bien, el JFrame principal lo construyo con este código:
Código: [Seleccionar]
ublic class Biblioteca extends JFrame {

//Modelo
private ArrayList<Socio> socios = new ArrayList<Socio>();
static int idSocios = 0; //Contador para autogenerar id para los socios
private ArrayList<Autor> autores = new ArrayList<Autor>();
private ArrayList<Libro> libros = new ArrayList<Libro>();
private ArrayList<Prestamo> prestamos = new ArrayList<Prestamo>();

//Vista
private PanelBotonMenu menuSocios = new PanelBotonMenu("Gestion Socios");
private PanelBotonMenu menuAutores = new PanelBotonMenu("Gestion Autores");
private PanelBotonMenu menuLibros = new PanelBotonMenu("Gestion Libros");
private PanelBotonMenu menuPrestamos = new PanelBotonMenu("Gestion Prestamos");

public Biblioteca() {
comenzarConDatosCargados();

JPanel pnPrincipal = new JPanel();
pnPrincipal.setLayout(new GridLayout(2,2,10,10));
pnPrincipal.add(menuSocios);
pnPrincipal.add(menuAutores);
pnPrincipal.add(menuLibros);
pnPrincipal.add(menuPrestamos);
menuSocios.btOpcion.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new DialogoSocio(null, true, socios);
}
});

setContentPane(pnPrincipal);

setTitle("Biblioteca");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new Biblioteca();
}
});
}


/*
* Este método carga algunos datos por defecto
* para poder hacer pruebas en el programa
*/
private void comenzarConDatosCargados() {
//Algunos socios
String id = String.format("SC%04d", idSocios);
socios.add(new Socio(id, "CED001", "Juan", "Marin Roca", "678901234", "994567890",
new Direccion("Sepulveda", "Roble", "34", TipoVivienda.CASA)));
idSocios++;
id = String.format("SC%04d", idSocios);
socios.add(new Socio(id, "CED002", "Sara", "Montes", "678901234", "994567890",
new Direccion("Azucena", "", "44", TipoVivienda.DEPARTAMENTO)));
idSocios++;
id = String.format("SC%04d", idSocios);
socios.add(new Socio(id, "CED003", "Jorge", "Morales", "678901234", "994567890",
new Direccion("Peru", "Ecuador", "11", TipoVivienda.EMPRESA)));
idSocios++;
id = String.format("SC%04d", idSocios);
socios.add(new Socio(id, "CED004", "Laura", "Sanchez", "678901234", "994567890",
new Direccion("Fresnedo", "", "67", TipoVivienda.DEPARTAMENTO)));
idSocios++;
//Algunos libros
libros.add(new Libro("978834556", "Cien años de soledad", "Gabriel Garcia Marquez", true,
new Localizacion("2", "4", "6", Area.ARTE_LITERATURA)));
libros.add(new Libro("978878912", "Lecturas y Pasiones", "Jose Luis Melero", true,
new Localizacion("1", "4", "5", Area.FILOLOGIA)));
libros.add(new Libro("978800781", "Sunies y Chiies", "Javier Martin", true,
new Localizacion("3", "3", "1", Area.RELIGION)));
libros.add(new Libro("978815690", "Salafismo", "Luz Gomez", true,
new Localizacion("3", "3", "2", Area.RELIGION)));
libros.add(new Libro("978813456", "Steven Universe Juego de Rol", "Rebecca Sugar", true,
new Localizacion("2", "3", "7", Area.GENERALIDADES)));
libros.add(new Libro("978890908", "Somos agua que piensa", "Joaquin Araujo", true,
new Localizacion("2", "8", "3", Area.CIENCIAS_NATURALES)));
//Correspondientes autores
Autor autor = new Autor("Gabriel Garcia Marquez", "Gabo", "Colombia", "6/3/1927");
autor.agregarLibro(libros.get(0));
autores.add(autor);
autor = new Autor("Jose Luis Melero", "", "España", "12/7/1956");
autor.agregarLibro(libros.get(1));
autores.add(autor);
autor = new Autor("Javier Martin", "", "Argentina", "11/9/1963");
autor.agregarLibro(libros.get(2));
autores.add(autor);
autor = new Autor("Luz Gomez", "", "España", "1/2/1969");
autor.agregarLibro(libros.get(3));
autores.add(autor);
autor = new Autor("Rebecca Sugar", "Sugar", "Estados Unidos", "9/7/1987");
autor.agregarLibro(libros.get(4));
autores.add(autor);
autor = new Autor("Joaquin Araujo", "", "España", "31/12/1947");
autor.agregarLibro(libros.get(5));
autores.add(autor);
}

Y la clase para crear el JDialog, es la siguiente. Fijaos que por el constructor le paso una referencia al ArrayList de Socios que se encuentra en la clase principal. Así el JDialog puede acceder directamente a la colección de socios.
Código: [Seleccionar]
public class DialogoSocio extends JDialog {

private ArrayList<Socio> socios;
private JComboBox<String> jcNumSocio;
private JTextField jtCedula;
private JTextField jtNombre;
private JTextField jtApellidos;
private JTextField jtTelefMovil;
private JTextField jtTelefConven;
private JTextField jtDireccion;
private JButton btNuevo;
private JButton btModificar;
private JButton btEliminar;
private JButton btGuardar;

public DialogoSocio(Frame padre, boolean modal, ArrayList<Socio> socios) {
super(padre, modal);
this.socios = socios;
inicializarComponentes();

JPanel pnDatos = new JPanel();
pnDatos.setLayout(new GridLayout(4,1,5,5));
JPanel pn1 = new JPanel();
pn1.setLayout(new GridLayout(1,2));
pn1.add(new PanelConLabel("Nº Socio: ", jcNumSocio));
pn1.add(new PanelConLabel("Nº Cedula: ", jtCedula));
JPanel pn2 = new JPanel();
pn2.setLayout(new GridLayout(1,2));
pn2.add(new PanelConLabel("Nombre: ", jtNombre));
pn2.add(new PanelConLabel("Apellidos: ", jtApellidos));
JPanel pn3 = new JPanel();
pn3.setLayout(new GridLayout(1,2));
pn3.add(new PanelConLabel("Tlf. Movil: ", jtTelefMovil));
pn3.add(new PanelConLabel("Tlf. Convenc: ", jtTelefConven));
JPanel pn4 = new JPanel();
pn4.add(new PanelConLabel("Direccion: ", jtDireccion));

pnDatos.add(pn1); pnDatos.add(pn2); pnDatos.add(pn3); pnDatos.add(pn4);

JPanel pnBotones = new JPanel();
pnBotones.add(btNuevo); pnBotones.add(btModificar);
pnBotones.add(btEliminar); pnBotones.add(btGuardar);

setLayout(new BorderLayout());
add(pnDatos, BorderLayout.CENTER);
add(pnBotones, BorderLayout.SOUTH);


setTitle("Gestion Socios");
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

private void inicializarComponentes() {
jcNumSocio = new JComboBox<String>();
for (Socio s: socios)
jcNumSocio.addItem(s.getNumSocio());
jtCedula = new JTextField(8);
jtNombre = new JTextField(8);
jtApellidos = new JTextField(8);
jtTelefMovil = new JTextField(8);
jtTelefConven = new JTextField(8);
jtDireccion = new JTextField(20);
btNuevo = new JButton("Nuevo Socio");
btNuevo.addActionListener(new AccionNuevoSocio());
btModificar = new JButton("Modificar Socio");
btModificar.addActionListener(new AccionModificarSocio());
btEliminar = new JButton("Eliminar Socio");
btEliminar.addActionListener(new AccionEliminarSocio());
btGuardar = new JButton("Guardar Socio");
btGuardar.addActionListener(new AccionGuardarSocio());

actualizarInterfaz();
jcNumSocio.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mostrarSocioSeleccionado();
}});
}

private void actualizarInterfaz() {

jtCedula.setEditable(false);
jtNombre.setEditable(false);
jtApellidos.setEditable(false);
jtTelefMovil.setEditable(false);
jtTelefConven.setEditable(false);
jtDireccion.setEditable(false);

if (socios.isEmpty()) {
jtCedula.setText(null);
jtNombre.setText(null);
jtApellidos.setText(null);
jtTelefMovil.setText(null);
jtTelefConven.setText(null);
jtDireccion.setText(null);
btNuevo.setEnabled(true);
btModificar.setEnabled(false);
btEliminar.setEnabled(false);
btGuardar.setEnabled(false);
}
else {
jcNumSocio.setSelectedIndex(0);
mostrarSocioSeleccionado();
btNuevo.setEnabled(true);
btModificar.setEnabled(true);
btEliminar.setEnabled(true);
btGuardar.setEnabled(false);
}
}

/*
* Muestra en los campos los datos del socio
* seleccionado actualmente en el JComboBox
*/
private void mostrarSocioSeleccionado() {
Socio s = socios.get(jcNumSocio.getSelectedIndex());
jtCedula.setText(s.getCedula());
jtNombre.setText(s.getNombre());
jtApellidos.setText(s.getApellidos());
jtTelefMovil.setText(s.getTelefMovil());
jtTelefConven.setText(s.getTelefConvencional());
jtDireccion.setText(s.getDireccion().getDatos());
}

private class PanelConLabel extends JPanel {

public PanelConLabel(String txt, JComponent comp) {
add(new JLabel(txt));
add(comp);
}
}

/*
* Configura la interfaz para que el usuario pueda
* crear un socio nuevo
*/
private class AccionNuevoSocio implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
jcNumSocio.setEnabled(false);
jtCedula.setText(null); jtCedula.setEditable(true);
jtNombre.setText(null); jtNombre.setEditable(true);
jtApellidos.setText(null); jtApellidos.setEditable(true);
jtTelefMovil.setText(null); jtTelefMovil.setEditable(true);
jtTelefConven.setText(null); jtTelefConven.setEditable(true);
jtDireccion.setText(null); jtDireccion.setEditable(true);
btModificar.setEnabled(false);
btEliminar.setEnabled(false);
btGuardar.setEnabled(true);
}
}

/*
* Configura la interfaz para que el usuario pueda
* modificar un socio seleccionado
*/
private class AccionModificarSocio implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
jcNumSocio.setEnabled(true);
jtCedula.setEditable(true);
jtNombre.setEditable(true);
jtApellidos.setEditable(true);
jtTelefMovil.setEditable(true);
jtTelefConven.setEditable(true);
jtDireccion.setEditable(true);
btModificar.setEnabled(false);
btEliminar.setEnabled(true);
btGuardar.setEnabled(true);
}
}

/*
* Elimina un socio seleccionado y reconfigura la
* interfaz tras la eliminación
*/
private class AccionEliminarSocio implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {

int respuesta = JOptionPane.showConfirmDialog(null, "¿Seguro que quiere eliminar este Socio",
"Eliminar Socio", JOptionPane.YES_NO_OPTION);

if (respuesta == JOptionPane.YES_OPTION) {
socios.remove(jcNumSocio.getSelectedIndex());
jcNumSocio.removeItemAt(jcNumSocio.getSelectedIndex());
actualizarInterfaz();
}
}
}

/*
* Guarda un socio nuevo o modificado y reconfigura la
* interfaz tras la eliminación
*/
private class AccionGuardarSocio implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//Recopilamos datos y comprobamos que no falta ningún dato importante
boolean faltanDatosImportantes = false;
String cedula = jtCedula.getText();
if (cedula.isBlank()) {
faltanDatosImportantes = true;
JOptionPane.showMessageDialog(null, "Campo Cédula no puede estar vacío",
"Guardar Socio", JOptionPane.WARNING_MESSAGE);
}
String nombre = jtNombre.getText();
if (nombre.isBlank()) {
faltanDatosImportantes = true;
JOptionPane.showMessageDialog(null, "Campo Nombre no puede estar vacío",
"Guardar Socio", JOptionPane.WARNING_MESSAGE);
}
String apellidos = jtApellidos.getText();
if (apellidos.isBlank()) {
faltanDatosImportantes = true;
JOptionPane.showMessageDialog(null, "Campo Apellidos no puede estar vacío",
"Guardar Socio", JOptionPane.WARNING_MESSAGE);
}
String telefM = jtTelefMovil.getText();
if (telefM.isBlank()) {
faltanDatosImportantes = true;
JOptionPane.showMessageDialog(null, "Campo Tlf Movil no puede estar vacío",
"Guardar Socio", JOptionPane.WARNING_MESSAGE);
}
String telefC = jtTelefConven.getText();
//Telefono convencional no es obligatorio
String direccion = jtDireccion.getText();
if (direccion.isBlank()) {
faltanDatosImportantes = true;
JOptionPane.showMessageDialog(null, "Campo Dirección no puede estar vacío",
"Guardar Socio", JOptionPane.WARNING_MESSAGE);
}

if (faltanDatosImportantes)
JOptionPane.showMessageDialog(null, "Faltan datos para poder guardar el Socio",
"Guardar Socio", JOptionPane.ERROR_MESSAGE);
else {
/*
* Antes de guardar, hay que saber si estamos creando un socio nuevo
* para añadirlo al ArrayList, o bien si estamos modificando un
* socio que ya existe en el ArrayList.
* Podemos distinguir entre un escenario y el otro según si el JComboBox
* está desactivado (nuevo socio) o si está activado(socio modificado)
*/
if (jcNumSocio.isEnabled()) { //Estamos modificando
int indice = jcNumSocio.getSelectedIndex();
socios.get(indice).setCedula(cedula);
socios.get(indice).setNombre(nombre);
socios.get(indice).setApellidos(apellidos);
socios.get(indice).setTelefMovil(telefM);
socios.get(indice).setTelefConvencional(telefC);
socios.get(indice).getDireccion().callePrincipal = direccion;
}
else { //Es un socio nuevo
String id = String.format("SC%04d", Biblioteca.idSocios);
Direccion nuevaDir = new Direccion();
nuevaDir.callePrincipal = direccion;
//Añadimos al ArrayList
socios.add(new Socio(id, cedula, nombre, apellidos, telefM, telefC, nuevaDir));
Biblioteca.idSocios++;
//Añadimos su id al combobox
jcNumSocio.addItem(id);
jcNumSocio.setSelectedIndex(jcNumSocio.getItemCount() - 1);
//Reactivamos el combobox
jcNumSocio.setEnabled(true);
}
btModificar.setEnabled(true);
btEliminar.setEnabled(true);
btGuardar.setEnabled(false);
jtCedula.setEditable(false);
jtNombre.setEditable(false);
jtApellidos.setEditable(false);
jtTelefMovil.setEditable(false);
jtTelefConven.setEditable(false);
jtDireccion.setEditable(false);
}
}
}
}

Los botones de acción no solo cogen y guardan datos. También activan/desactivan campos y botones según cada caso.
Por ejemplo, los campos de texto comienzan siendo "no editables", solo muestran datos.
Cuando se pulsa el botón Modificar, entonces se vuelven "editables" para que el usuario pueda cambiar los valores.
Al pulsar el botón Guardar, vuelven a ser de "solo lectura".

No tengo tiempo para hacer más por ahora, ni para explicar más a fondo el código.
Pruébalo, quizás tengas que adaptarlo a las clases de tu Modelo si no estás usando las que escribí yo en mensajes anteriores.
De hecho, yo mismo he tenido que hacer una "chapucilla" para el campo dirección, ya que en la interfaz trato este dato como una simple línea String, pero mi clase Socio el atributo Dirección es mucho más complejo, ya que es una clase con cuatro atributos distintos.
Pero no quería perder tiempo en crear más campos para la dirección.

Si te ves capaz, intentar hacer lo mismo pero para gestionar los libros.
Si tienes dudas concretas, pregúntalas.

Yo intentaré continuarlo cuando pueda.
Un saludo.

246
Párrafo 3.

Añadir a la clase Mes un método para exportar a txt:
Código: [Seleccionar]
public void exportar() {
File salida = new File("visitasTuristicasDelMesDe" + nombreMes + ".txt");
try {
BufferedWriter escritor = new BufferedWriter(new FileWriter(salida));
//Recorremos los valores del HashMap
for (Visita v: visitas.values()) {
escritor.write(v.toString());
escritor.newLine();
}
escritor.close();
} catch (IOException e) {
System.out.println("Error exportando las Visitas a txt:\n" + e.getMessage());
}
}

Y ahora quedaría probar el código escrito.
Creamos una clase main donde construimos un mes y le añadimos un par de Tours y un par de Visitas.
En este ejemplo, pruebo lo de mostrar en pantalla ordenado y lo de exportar a txt.
Todo parece funcionar bien.
Código: [Seleccionar]
public class Test {

public static void main(String[] args) {
//Creamos un mes
Mes febrero = new Mes("Febrero");
//Añadimos un par de Excursiones
febrero.addVisita(new Excursion("Sur de Francia", new String[] {"Leucate", "Gruisan"},
"Francia", 45, "Visita Parque Natural Narbonaise", "Frances", 15, false, "15/02/2022",
"09:45", 12, true));
febrero.addVisita(new Excursion("Costa Cantabra", new String[] {"Santoña", "Santander"},
"España", 363, "Vista Palacio de la Magdalena", "Español", 25, true, "21/02/2022",
"09:30", 8, false));
//Y un par de Tours
febrero.addVisita(new Tour("Ruta Portuguesa",
new String[] {"Braga", "Oporto", "Ovar", "Agueda", "Coimbra", "Lisboa"}, "Portugal", 65,
"Paseo en barco por Rio Duero", "Portugues", 8, true, "19/02/2022", "09:00", "24/02/2022",
"20:00", new String[] {"La Braganza", "O portico", "Ovar Hilton", "Santa Agueda",
"El Coimbrano", "Lisbon HR"}));
febrero.addVisita(new Tour("Al-Andalus",
new String[] {"Sevilla", "Cadiz", "Marbella", "Motril", "Almeria",}, "España", 50,
"Excursion por el Parque Natural Los Alcornocales", "Español", 12, false, "01/02/2022", "09:00",
"05/02/2022", "18:00", new String[] {"Sevilla Hilton", "El Gaditano", "Marbella City",
"Hotel Alhambra", "Reino Almeria"}));

//Probamos a listarlos ordenados en pantalla
febrero.imprimirOrdenadas();

//Y exportamos a txt
febrero.exportar();

}

}

Quedaría probar los otros métodos de cambiar hotel o eliminar una visita por fecha.
Esto ya lo dejo en tus manos.

Pregunta lo que no entiendas.
Un saludo.

247
Bien, siguiente parrafo.
La clase Mes nos dice que tiene dos atributos, un String con el nombre del mes que representa y un HashMap para albergar objetos de la clase Visita (es decir, Tours y Excursiones) y la clave para mapearlos será el nombre de la Visita, es decir, un String.

Bien, vayamos haciendolo paso a paso. Aquí comenzamos con los dos atributos, un constructor (al que yo le veo sentido que reciba el nombre del mes) y métodos get/set para el atributo String.
El HashMap, al menos en este caso, no tiene sentido que tenga también un get y/o set.

Código: [Seleccionar]
import java.util.HashMap;

public class Mes {

private HashMap<String, Visita> visitas;
private String nombreMes;

public Mes(String nombreMes) {
this.nombreMes = nombreMes;
visitas = new HashMap<String, Visita>();
}

public String getNombreMes() {
return nombreMes;
}

public void setNombreMes(String nombreMes) {
this.nombreMes = nombreMes;
}




}
Que dice a continuación:
Citar
Debe disponer de un método para añadir una visita y otro para borrar una visita dada la fecha de salida.

Bien, añadir una visita es fácil. Se usa su nombre como clave para mapear y listo.

Borrarla, según fecha, ya supone un código algo más elaborado.
Habrá que recorrer los valores del HashMap para buscar alguno que coinicida con la fecha de salida que se nos indique.
Como están guardados bajo el tipo Visita, y esta clase madre no tiene atributos de fecha, a cada valor habrá que preguntarle si es un Tour o una Excursion, hacer casting a la clase que le corresponda, y ahora sí podremos consultar su valor para el atributo fecha de salida.

Si encontramos alguno que coincida, pues lo fusilamos del HashMap..

Código: [Seleccionar]
public class Mes {

private HashMap<String, Visita> visitas;
private String nombreMes;

public Mes(String nombreMes) {
this.nombreMes = nombreMes;
visitas = new HashMap<String, Visita>();
}

public String getNombreMes() {
return nombreMes;
}

public void setNombreMes(String nombreMes) {
this.nombreMes = nombreMes;
}

public void addVisita(Visita visita) {
visitas.put(visita.getNombre(), visita);
}

public void borrarVisita(String fechaSalida) {
Visita borrar = null;
//Recorremos los valores del hashmap
for (Visita v: visitas.values()) {
/*
* Los objetos están guardados como Visita.
* Para poder consultar sus fechas de salida, hay
* que castearlos a Tour o Excursion, según corresponda
*/
if(v instanceof Excursion) { //Es una Excursion
Excursion ex = (Excursion) v; //Casting
if (ex.getFechaSalida().equals(fechaSalida)) {//¿Coincide la fecha de salida?
borrar = v; //Pues entonces esta es la que vamos borrar
break; //Dejamos de buscar
}
}
else  {//Si no es Excursion, pues es un Tour
Tour to = (Tour) v;
if (to.getFechaSalida().equals(fechaSalida)) {
borrar = to;
break;
}
}
}

//Tras recorrer los valores, comprobamos si hemos encontrado alguna visita para borrar
if (borrar == null)
System.out.println("No se ha encontrado ninguna visita para la fecha: " + fechaSalida);
else { //borrar tiene algún valor, es la Visita que hay que eliminar
visitas.remove(borrar.getNombre());//Indicamos clave para borrar
System.out.println("Se ha eliminado la Visita con el nombre: " + borrar.getNombre());
}


}


}

Siguiente petición :
Citar
Otro método deberá imprimirlas por orden alfabético (usa un vector auxiliar)
Bien, para esto habrá que extraer los valores del hashmap en una colección auxiliar y ordenarlos alfabéticamente por nombre..
Y para ordenarlos de forma más cómoda y eficiente, lo ideal sería enseñarle a la clase Visita cómo ha de comparar sus objetos para ordenarse como queremos.
Así que podemos modificar la clase Visita implementándole la interfaz Comparable y sobreescribiendo el método compareTo(), donde le diremos que para ordenarse hay que comparar los nombres de las visitas.
Marco en azul los cambios
Citar
public abstract class Visita implements Comparable<Visita> {
   
   private String nombre;
   private String[] ciudades;
   private String pais;
   private double precioPersona;
   private String extras;
   private String idioma;
   private int personasApuntadas;
   private boolean accesible;
   
   public Visita(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
         int personasApuntadas, boolean accesible) {
      this.nombre = nombre;
      this.ciudades = ciudades;
      this.pais = pais;
      this.precioPersona = precioPersona;
      this.extras = extras;
      this.idioma = idioma;
      this.personasApuntadas = personasApuntadas;
      this.accesible = accesible;
   }

   public String getNombre() {
      return nombre;
   }

   public void setNombre(String nombre) {
      this.nombre = nombre;
   }

   public String[] getCiudades() {
      return ciudades;
   }

   public void setCiudades(String[] ciudades) {
      this.ciudades = ciudades;
   }

   public String getPais() {
      return pais;
   }

   public void setPais(String pais) {
      this.pais = pais;
   }

   public double getPrecioPersona() {
      return precioPersona;
   }

   public void setPrecioPersona(double precioPersona) {
      this.precioPersona = precioPersona;
   }

   public String getExtras() {
      return extras;
   }

   public void setExtras(String extras) {
      this.extras = extras;
   }

   public String getIdioma() {
      return idioma;
   }

   public void setIdioma(String idioma) {
      this.idioma = idioma;
   }

   public int getPersonasApuntadas() {
      return personasApuntadas;
   }

   public void setPersonasApuntadas(int personasApuntadas) {
      this.personasApuntadas = personasApuntadas;
   }

   public boolean esAccesible() {
      return accesible;
   }

   public void setAccesible(boolean accesible) {
      this.accesible = accesible;
   }

   @Override
   public String toString() {
      return String.format(
            "[nombre=%s, ciudades=%s, pais=%s, precioPersona=%.2f, extras=%s, idioma=%s, personasApuntadas=%d, accesible=%s",
            nombre, Arrays.toString(ciudades), pais, precioPersona, extras, idioma, personasApuntadas, accesible?"SI":"No");
   }
   
   @Override
   public int compareTo(Visita otraVisita) {
      return nombre.compareTo(otraVisita.nombre);
   }

}

Con estos cambios, ahora en la clase Mes podemos escribir un método para imprimir la visitas en orden alfabético y usando muy poco código.
Podemos crear un array con los valores del HashMap, ordenarlo e imprimirlo.
Código: [Seleccionar]
public void imprimirOrdenadas() {
//Creamos array
Visita[] aux = new Visita[visitas.size()];

//Traspasamos las visitas al array
int i = 0;
for (Visita v: visitas.values()) {
aux[i] = v;
i++;
}

//Ordenamos array
Arrays.sort(aux);


//Imprimimos en pantalla, cada Visita se mostrará según su método toString()
for (Visita v: aux)
System.out.println(v);
}

Que más...
Citar
Otro, almorzar, que recibirá un parámetro de tipo boolean, permitirá poner en todas las excursiones de un día el atributo almuerzo a true o false, según el boolean recibido.
Mmmhh. no está muy bien redactado esto. Supongo que además del boolean, se ha de indicar la fecha de las excursiones que se quiere cambiar, ¿no?
Código: [Seleccionar]
public void almorzar(String fechaSalida, boolean conAlmuerzo) {
//Recorremos valores del map buscando Excursiones
for (Visita v: visitas.values()) {
if (v instanceof Excursion) {
Excursion ex = (Excursion) v;
if (ex.getFechaSalida().equals(fechaSalida))
ex.setConAlmuerzo(conAlmuerzo);
}
}
}

Para terminar el párrafo 2:
Citar
Por último, un método cambiarHotel, cuyos parámetros serán: el nombre de un tour, una de sus ciudades y el nombre de un hotel. Deberá cambiar en ese tour y en esa ciudad el nombre del hotel antiguo por este nuevo que recibe.

Bien con el nombre de la Visita, ya tenemos la clave para buscarla en el HashMap.
Una vez obtenida, comprobamos si realmente es un Tour y en ese caso le hacemos casting.
Una vez tenemos el Tour, obtenemos de este objeto los arrays de Hoteles y Ciudades.
Buscamos la ciudad indicada en el array, su posición nos dirá donde tenemos que insertar el nuevo nombre del hotel
Código: [Seleccionar]
public void cambiarHotel(String nombre, String ciudad, String hotel) {
//Buscamos la Visita/Tour, su nombre nos da la clave
Visita v = visitas.get(nombre);
//Comprobamos si se ha encontrado
if (v == null)
System.out.println("No se ha encontrado ninguna Visita con el nombre: " + nombre);
else {
//Visita encontrada, ahora comprobamos si realmente es un Tour
if (v instanceof Tour) { //Sí lo es
Tour t = (Tour) v;
//Obtenemos array de ciudades, para buscar la posicion que ocupa la ciudad indicada
//En esa misma posicion, habrá que cambiar el nombre en el array de hoteles
String[] ciudades = t.getCiudades();
String[] hoteles = t.getHoteles();
for (int i = 0; i < ciudades.length; i++) {
if (ciudades[i].equals(ciudad)) //ciudad encontrada
hoteles[i] = hotel; //Cambiamos hotel
}
}
else //No es Tour
System.out.println("El nombre de Visita indicado no corresponde a un Tour");
}
}

Y me quedé sin tiempo, mañana vemos el párrafo 3

248
Hola.
Ya que no muestras como has hecho las clases del primer párrafo, te muestro como las haría yo. Todos modos tengo que escribirlas porque si no, no puedo avanzar con los siguientes párrafos.

Primero la clase Visita, con todos sus atributos y métodos.
La declaro como abstracta porque se entiende que no queremos construir objetos new Visita(), solo construiremos objetos de las clases hijas Excursiones y Tours.
No es obligatorio declararla abstracta, pero es una forma de impedir la creación de objetos Visita y además evidenciamos que es una clase destinada a ser "madre" de otras.
Código: [Seleccionar]
import java.util.Arrays;

public abstract class Visita {

private String nombre;
private String[] ciudades;
private String pais;
private double precioPersona;
private String extras;
private String idioma;
private int personasApuntadas;
private boolean accesible;

public Visita(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
int personasApuntadas, boolean accesible) {
this.nombre = nombre;
this.ciudades = ciudades;
this.pais = pais;
this.precioPersona = precioPersona;
this.extras = extras;
this.idioma = idioma;
this.personasApuntadas = personasApuntadas;
this.accesible = accesible;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String[] getCiudades() {
return ciudades;
}

public void setCiudades(String[] ciudades) {
this.ciudades = ciudades;
}

public String getPais() {
return pais;
}

public void setPais(String pais) {
this.pais = pais;
}

public double getPrecioPersona() {
return precioPersona;
}

public void setPrecioPersona(double precioPersona) {
this.precioPersona = precioPersona;
}

public String getExtras() {
return extras;
}

public void setExtras(String extras) {
this.extras = extras;
}

public String getIdioma() {
return idioma;
}

public void setIdioma(String idioma) {
this.idioma = idioma;
}

public int getPersonasApuntadas() {
return personasApuntadas;
}

public void setPersonasApuntadas(int personasApuntadas) {
this.personasApuntadas = personasApuntadas;
}

public boolean esAccesible() {
return accesible;
}

public void setAccesible(boolean accesible) {
this.accesible = accesible;
}

@Override
public String toString() {
return String.format(
"[nombre=%s, ciudades=%s, pais=%s, precioPersona=%.2f, extras=%s, idioma=%s, personasApuntadas=%d, accesible=%s",
nombre, Arrays.toString(ciudades), pais, precioPersona, extras, idioma, personasApuntadas, accesible?"SI":"No");
}

}

Aquí la clase hija Excursion. Su método toString() se complementa con lo que retorna el de su clase madre.
Código: [Seleccionar]
public class Excursion extends Visita {

private String fechaSalida;
private String horaSalida;
private int horasDura;
private boolean conAlmuerzo;

public Excursion(String nombre, String[] ciudades, String pais, double precioPersona, String extras,
String idioma, int personasApuntadas, boolean accesible, String fechaSalida, String horaSalida,
int horasDura, boolean conAlmuerzo) {
super(nombre, ciudades, pais, precioPersona, extras, idioma, personasApuntadas, accesible);
this.fechaSalida = fechaSalida;
this.horaSalida = horaSalida;
this.horasDura = horasDura;
this.conAlmuerzo = conAlmuerzo;
}

public String getFechaSalida() {
return fechaSalida;
}

public void setFechaSalida(String fechaSalida) {
this.fechaSalida = fechaSalida;
}

public String getHoraSalida() {
return horaSalida;
}

public void setHoraSalida(String horaSalida) {
this.horaSalida = horaSalida;
}

public int getHorasDura() {
return horasDura;
}

public void setHorasDura(int horasDura) {
this.horasDura = horasDura;
}

public boolean esConAlmuerzo() {
return conAlmuerzo;
}

public void setConAlmuerzo(boolean conAlmuerzo) {
this.conAlmuerzo = conAlmuerzo;
}

@Override
public String toString() {
return String.format("Excursion %s, fechaSalida=%s, horaSalida=%s, horasDura=%s, conAlmuerzo=%s]",
super.toString(), fechaSalida, horaSalida, horasDura, conAlmuerzo);
}

}

Y clase Tour
Código: [Seleccionar]
import java.util.Arrays;

public class Tour extends Visita {

private String fechaSalida;
private String horaSalida;
private String fechaLlegada;
private String horaLlegada;
private String[] hoteles;

public Tour(String nombre, String[] ciudades, String pais, double precioPersona, String extras, String idioma,
int personasApuntadas, boolean accesible, String fechaSalida, String horaSalida,
String fechaLlegada, String horaLlegada, String[] hoteles) {
super(nombre, ciudades, pais, precioPersona, extras, idioma, personasApuntadas, accesible);
this.fechaSalida = fechaSalida;
this.horaSalida = horaSalida;
this.fechaLlegada = fechaLlegada;
this.horaLlegada = horaLlegada;
this.hoteles = hoteles;
}

public String getFechaSalida() {
return fechaSalida;
}

public void setFechaSalida(String fechaSalida) {
this.fechaSalida = fechaSalida;
}

public String getHoraSalida() {
return horaSalida;
}

public void setHoraSalida(String horaSalida) {
this.horaSalida = horaSalida;
}

public String getFechaLlegada() {
return fechaLlegada;
}

public void setFechaLlegada(String fechaLlegada) {
this.fechaLlegada = fechaLlegada;
}

public String getHoraLlegada() {
return horaLlegada;
}

public void setHoraLlegada(String horaLlegada) {
this.horaLlegada = horaLlegada;
}

public String[] getHoteles() {
return hoteles;
}

public void setHoteles(String[] hoteles) {
this.hoteles = hoteles;
}

@Override
public String toString() {
return String.format("Tour %s, fechaSalida=%s, horaSalida=%s, fechaLlegada=%s, horaLlegada=%s, hoteles=%s]",
super.toString(), fechaSalida, horaSalida, fechaLlegada, horaLlegada, Arrays.toString(hoteles));
}

}

Luego sigo con el siguiente párrafo.

249
Claro.
Tu objeto llamado "entrada" es de la clase CantantesFamosos.
Aquí lo usas para crear un cantante y es correcto:
Código: [Seleccionar]
CantantesFamosos entrada = new CantantesFamosos();
        System.out.println("Ingrese un cantante famoso: ");
        entrada.setNombre(entradaEscaner.nextLine());
        System.out.println("Ahora el disco con más venta de ese cantante: ");
        entrada.setDiscoConMasVentas(entradaEscaner.nextLine());
        listaCantantesFamosos.addCantante(entrada);
Fíjate que en ese código, no estamos asignándole un String a "entrada". Le estamos asignando un objeto CantantesFamosos, cuyos atributos se componen de dos Strings, pero eso no significa que "cantante" sea un String.

Por eso luego al querer usar ese mismo objeto para pedir una cadena String al usuario, da error:
Código: [Seleccionar]
while (!entrada.equals("no")){
            System.out.println("\nAgregar otro cantante a la lista?(si/no): ");
            entrada = entradaEscaner.nextLine();
Es imposible. Son cosas distintas. Si quieres pedir una cadena String al usuario, pues tienes que declarar un objeto que sea de la clase String y que además tenga otro nombre.
Yo por ejemplo, usé el nombre "respuesta" para el objeto String
Código: [Seleccionar]
String respuesta = "";
       
        while (!respuesta.equals("no")) {
        System.out.print("\nAgregar otro cantante a la lista?(si/no): ");
        respuesta = entradaEscaner.nextLine();
Porque ahí lo queremos es que el usuario nos diga sí o no a la pregunta de continuar añadiendo cantantes, y para recibir esa respuesta, necesitamos guardarla en un String.

250
Vamos por partes.

Tu clase CantantesFamosos es correcta como está, aunque yo le añadiría un constructor donde se reciban los valores para los atributos.
Y ya puestos, un segundo constructor donde se pueda inicializar el objeto con unos valores "por defecto".

Código: [Seleccionar]
public class CantantesFamosos
{
    private String nombre;
    private String discoConMasVentas;
   
    //Constructor que recibe valores
    public CantantesFamosos(String valorNombre, String valorDiscoConMasVentas) {
nombre = valorNombre;
discoConMasVentas = valorDiscoConMasVentas;
}
    //Constructor con valores "por defecto"
    public CantantesFamosos() {
nombre = "";
discoConMasVentas = "";
}

public void setNombre (String valorNombre){
        nombre = valorNombre;
    }
   
    public void setDiscoConMasVentas (String valorDiscoConMasVentas){
        discoConMasVentas = valorDiscoConMasVentas;
    }
   
    public String getNombre () {return nombre;}
   
    public String getDiscoConMasVentas () {return discoConMasVentas;}
   
}

En cambio la clase ListaCantantesFamosos11, sí que hay que corregir cosas.

Su atributo ArrayList, no es para tipo String
Citar
public class ListaCantantesFamosos11
{
    private ArrayList <String> listaCantantesFamosos;

Será para el tipo CantantesFamosos, ya que eso es lo que queremos almacenar

Citar
public class ListaCantantesFamosos11
{
    private ArrayList <CantantesFamosos> listaCantantesFamosos;

Su constructor, tan solo debe inicializar el ArrayList. Nada más.
Tú además has inicializado un objeto CantantesFamosos y un objeto ListaCantantesFamosos11 (mal escrito por cierto porque has puesto que termina en 1 y no en 11)
Esos objetos son innecesarios y no aportan nada al programa.

También has hecho que en el constructor se añadan dos cantantes a la lista. El enunciado dice que estos dos cantantes se añadan en la clase Test, pero bueno, si quieres también podemos hacerlo aquí en el constructor.

Código: [Seleccionar]
    public ListaCantantesFamosos11 () {
        listaCantantesFamosos = new ArrayList <CantantesFamosos>();
        //Añadimos dos objetos CantantesFamosos al ArrayList
        listaCantantesFamosos.add(new CantantesFamosos("Ariana Grande", "7 Rings"));
        listaCantantesFamosos.add(new CantantesFamosos("Ed Sheeran", "="));
    }

Fíjate que para añadir esos dos objetos, utilizo el constructor de CantantesFamosos que recibe valores para los atributos, ya que es lo más cómodo.

Bien, ¿qué métodos vamos a necesitar para esta clase?
Para empezar, uno que permita añadir más objetos al ArrayList
Código: [Seleccionar]
    public void addCantante(CantantesFamosos cantante) {
    listaCantantesFamosos.add(cantante);
    }

Luego, la lista de cantantes ha de ser recorrida con un Iterator. Entonces, aquí tenemos dos opciones.
Una, es usar un método que retorne el iterador para que desde otra clase distinta, pueda recogerse y recorrer la lista desde ahí. Es recomendable (no obligatorio) especificar de que clase son los objetos que contiene el Iterator que se está retornando:
Código: [Seleccionar]
    public Iterator<CantantesFamosos>  getIterador() {
    return listaCantantesFamosos.iterator();
    }

La otra opción, es usar el Iterator de forma interna, sin retornar nada. O sea, hacemos un método que se encargue el mismo de recorrer y mostrar la lista.
Podemos también añadir una comprobación extra, si se diera el caso de que la lista esta vacía que muestre un mensaje informando.
En caso contrario, pues entonces sí creamos un Iterator y recorremos los objetos de la lista.
Código: [Seleccionar]
    public void mostrarListaCantantes() {
    System.out.println("\n\t\tLISTA CANTANTES FAMOSOS\n");
   
    if (listaCantantesFamosos.isEmpty())
    System.out.println("La lista de cantantes esta vacía...");
    else {
    //Creamos iterador
    Iterator<CantantesFamosos> it = listaCantantesFamosos.iterator();
    while (it.hasNext()) {
    //Obtenemos el siguiente objeto del iterador
    CantantesFamosos cantante = it.next();
    //Mostramos sus valores
    System.out.println("Nombre: " + cantante.getNombre() + " -- Disco Top Ventas: " + cantante.getDiscoConMasVentas());
    }
    }
    }

Y ya está, no se necesita nada más para esta clase. Podemos dejar escrita en ella las dos posibilidades para el Iterator, para que sirva de ejemplo.
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;

public class ListaCantantesFamosos11
{
    private ArrayList <CantantesFamosos> listaCantantesFamosos;
   
    public ListaCantantesFamosos11 () {
        listaCantantesFamosos = new ArrayList <CantantesFamosos>();
        //Añadimos dos objetos CantantesFamosos al ArrayList
        listaCantantesFamosos.add(new CantantesFamosos("Ariana Grande", "7 Rings"));
        listaCantantesFamosos.add(new CantantesFamosos("Ed Sheeran", "="));
    }   
   
    public void addCantante(CantantesFamosos cantante) {
    listaCantantesFamosos.add(cantante);
    }
   
    //Retorna un Iterator para que la lista puede recorrerse de forma EXTERNA desde otra clase
    public Iterator<CantantesFamosos> getIterador() {
    return listaCantantesFamosos.iterator();
    }
   
    //Usa un Iterator para recorrer la lista de forma INTERNA
    public void mostrarListaCantantes() {
    System.out.println("\n\t\tLISTA CANTANTES FAMOSOS\n");
   
    if (listaCantantesFamosos.isEmpty())
    System.out.println("La lista de cantantes esta vacía...");
    else {
    //Creamos iterador
    Iterator<CantantesFamosos> it = listaCantantesFamosos.iterator();
    while (it.hasNext()) {
    //Obtenemos el siguiente objeto del iterador
    CantantesFamosos cantante = it.next();
    //Mostramos sus valores
    System.out.println("Nombre: " + cantante.getNombre() + " -- Disco Top Ventas: " + cantante.getDiscoConMasVentas());
    }
    }
    }

}


Y vamos ahora con la clase Test principal.

Lo primero será crear un objeto Scanner para pedir datos y un objeto para la lista de cantantes famosos.
Como hemos hecho que su constructor añada directamente dos cantantes, una vez construido ya podemos mostrar en pantalla la lista de cantantes actual.

Y tras eso pasaríamos a preguntar al usuario si quiere añadir más cantantes o no.
Para añadir nuevos cantantes, podemos usar cualquiera de los dos constructores que le hemos puesto a la clase CantantesFamosos.
Antes, al inicializar el ArrayList, hemos usado el constructor que recibe los valores.

Ahora, para variar, podemos usar el que NO recibe valores, y por tanto, se han de usar los setters para establecer los valores del nuevo objeto creado.

Código: [Seleccionar]
public class TestListaCantantesFamosos11
{
   
    public static void main (String [] args){
        Scanner entradaEscaner = new Scanner (System.in);
       
        //El constructor de este objeto, ya añade dos cantantes automáticamente
        ListaCantantesFamosos11 listaCantantesFamosos = new ListaCantantesFamosos11();
       
        listaCantantesFamosos.mostrarListaCantantes();
       
        //A partir de aquí, el usuario decide si quiere ampliar la lista
        String respuesta = "";
       
        while (!respuesta.equals("no")) {
        System.out.print("\nAgregar otro cantante a la lista?(si/no): ");
        respuesta = entradaEscaner.nextLine();
        if (!respuesta.equals("no")) {
        //Creamos nuevo cantante
        CantantesFamosos nuevo = new CantantesFamosos();
        //Pedimos datos
        System.out.print("Nombre del Cantante: ");
        nuevo.setNombre(entradaEscaner.nextLine());
        System.out.print("Disco mas vendido: ");
        nuevo.setDiscoConMasVentas(entradaEscaner.nextLine());
        //Añadimos a la lista
        listaCantantesFamosos.addCantante(nuevo);
        //Mostramos lista actualizada
        listaCantantesFamosos.mostrarListaCantantes();
        }
        }
       
        System.out.println("\n\n\t\tFIN DE PROGRAMA");
        entradaEscaner.close();
       
    }
}

Y con esto ya estaría completo el ejercicio.

En tu clase principal, hay algunos errores conceptuales.

Por ejemplo, pedias nombre y disco más vendido para guardarlos en un String. Esto podría estar bien.
Pero luego a esos String, le intentas aplicar los getters que corresponde a la clase CantantesFamosos

Citar
        System.out.println("Ingrese un cantante famoso: ");
        String entrada1 = entradaEscaner.nextLine();
        System.out.println("Ahora el disco con más venta de ese cantante: ");
        String entrada2 = entradaEscaner.nextLine();
        listaCantantesFamosos.addNombre(entrada1.getNombre());
        listaCantantesFamosos.addNombre(entrada2.getDiscoConMasVentas());

Espero que viendo el código que he escrito, se disipen estos errores de concepto.
No dudes en preguntar cualquier cosa que no entiendas, aunque pienses que es una tontería.

Un saludo.

251
La clase principal no tiene porque ser demasiado complicada, básicamente es poder probar las distintas clases Producto.

Así que puedes simplemente pedir datos por teclado, los necesarios para crear cada tipo de producto.

Puedes dejar los atributos como los tienes ahora y pedir datos de esta manera:
Código: [Seleccionar]
import java.util.Scanner;

public class TestHerencia2
{
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        //Peticion de datos
        System.out.println("Vamos a crear un Producto Refrigerado");
        System.out.print("Introduzca fecha caducidad: ");
        String fechaRefri = teclado.nextLine();
        System.out.print("Introduzca numero de lote: ");
        String loteRefri = teclado.nextLine();
        System.out.print("Introduzca codigo de supervision: ");
        String codigoRefri = teclado.nextLine();
        //construimos objeto con los datos obtenidos
        ProductoRefrigerado refrigerado = new ProductoRefrigerado(fechaRefri, loteRefri, codigoRefri);
        //Mostramos datos del objeto creado
        System.out.print("Nuevo Refrigerado creado:");
        refrigerado.imprimoDatos();
    }
}

Siguiendo ese ejemplo, haz lo mismo para los dos tipos de productos.

252
A ver, para modular el código y tenerlo un poco más ordenado, puedes crear dos clases adicionales, una para trabajar con el archivo de texto y otra para el archivo de ranking.

La del archivo de texto puedes hacer que lea el texto una sola vez en su constructor y guardar las líneas obtenidas en un atributo.
Así, con un método puedes pedirle una palabra al azar tantas veces como quieras sin tener que repetir lecturas en disco.

El constructor de esta clase recibiría la ruta del archivo que ha de leer, haría la lectura y obtendría el texto.
Este proceso, en Java es obligatorio controlar posibles excepciones (archivo no existe, archivo no es legible por estar corrupto o protegido...), así que el constructor de esta clase debería "lanzar" estas excepciones para poder recibirlas en la clase principal del programa.

Porque en la clase principal, el programa solo debería ejecutarse si ha sido posible obtener un texto (no han habido excepciones). Si no es así, debería informar del problema en pantalla y terminar, ya que no tiene sentido ofrecer al usuario poder jugar si no tenemos palabras.

Esta podría ser la clase ArchivoTexto
Código: [Seleccionar]
mport java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;

public class ArchivoTexto{

private StringBuilder texto; //Texto que se leera desde fichero

public ArchivoTexto(String ruta) throws Exception {
texto = new StringBuilder();
try {
BufferedReader lector = new BufferedReader(new FileReader(ruta));
//Los archivos de texto se leen línea a línea
String linea = lector.readLine();
while (linea != null) {
texto.append(linea + "\n");
linea = lector.readLine();
}
lector.close();
//Comprobamos que realmente hemos obtenido algún texto
if (texto.toString().isBlank())
throw new Exception("No se obtuvo texto.\nEl archivo: " + ruta + " parece estar en blanco.");
else {
System.out.println("Archivo texto: OK");
System.out.println("Texto obtenido:\n" + toString());
}
} catch (FileNotFoundException e) {
throw new Exception("No se encuentra fichero en " + ruta);
} catch (IOException e) {
throw new Exception("Error accediendo a fichero.\n" + e.getLocalizedMessage());
}
}

public String getPalabraAzar() {
//Construimos un array con todas las palabras del texto
String[] palabras = texto.toString().split(" ");
//Generamos un indice al azar, según la cantidad de palabras obtenidas
Random azar = new Random();
int indice = azar.nextInt(palabras.length);
//Retornamos palabra al azar
return palabras[indice];
}

@Override
public String toString() {
return texto.toString();
}

}

La clase ArchivoRanking es un poco parecida, pero más simple.
Su constructor también recibe la ruta del archivo donde se han de escribir las puntuaciones, pero simplemente lo guarda en un atributo.

Escribiremos un método que reciba como argumentos el nombre del jugador y los puntos para intentar escribirlos en el archivo.
Para este proceso también es obligado controlar posibles excepciones.
Pero en esta ocasión no es necesaria "lanzarlas" al programa principal, porque podemos permitir que el programa siga ejecutándose aunque esté fallando el proceso de guardar las puntuaciones.
El jugador al menos podrá seguir jugando ya que en teoría si dispondremos de palabras.

Así que la posibles excepciones las gestionará el método de forma interna, sin lanzarlas.
En todo caso, podemos hacer que el método sea boolean. Así si todo ha ido bien, retornará true.
Si ha fallado por ocurrir una excepción, mostramos en pantalla el mensaje de error y retornamos false.

Esta sería la clase ArchivoRanking
Código: [Seleccionar]
import java.io.BufferedWriter;
import java.io.FileWriter;

public class ArchivoRanking {

private String ruta;

public ArchivoRanking(String ruta) {
this.ruta = ruta;
}

public boolean guardarPuntuacion(String nombre, int puntos) {
try {
BufferedWriter escritor = new BufferedWriter(new FileWriter(ruta, true));
escritor.write("Nombre: " + nombre + " --- Puntos: " + puntos);
escritor.newLine();
escritor.close();
return true;
} catch (Exception e) {
System.out.println("Error al crear o acceder al archivo: " + ruta + "\n" + e.getLocalizedMessage());
return false;
}
}

}

Y ya luego, en el programa principal, colocaremos dos objetos de estas clases como atributos de ámbito global para que estén totalmente accesibles dentro de esta clase.

Lo primero que haremos será inicializar el objeto ArchivoTexto, que obligatoriamente tenemos que poner try catch para capturar las posibles excepciones que puede lanzar.
Si todo va bien, automáticamente se mostrará en pantalla el texto que se ha obtenido.

Ya luego solo hay que inicializar el objeto ArchivoRanking y ya puede comenzar el resto del programa, con el menú y el código para jugar al Ahorcado.

Código: [Seleccionar]
public class Ahorcado {

private static ArchivoTexto texto;
private static ArchivoRanking ranking;

public static void main(String[] args) {

try {
texto = new ArchivoTexto("info.txt");
ranking = new ArchivoRanking("ranking.txt");

String oculta = texto.getPalabraAzar();

//A partir de aquí, código para el menú y juego del ahorcado



} catch (Exception e) {
System.out.println(e.getMessage());
}

System.out.println("\n\t\tFIN DE PROGRAMA");

}

}

El objeto ArchivoTexto nos dará una palabra "oculta" al azar, siempre que se la pidamos.
Y el objeto ArchivoRanking guardará las puntuaciones que le vayamos indicando.

Como puedes ver, separando estos procesos en distintas clases, el código queda más ordenado.

Si algo no se entiende, solo tienes que preguntar.
Un saludo.

253
No sé si se debe a que has puesto dos guiones, en lugar de solo uno:

Citar
Para k<--0 Hasta k<(c-1) Con Paso 1 Hacer

254
Hola.
A la clase Producto le faltarían atributos
Citar
Todos los productos llevan esta información común: Código, nombre del producto, precio, fecha de caducidad y número de lote.

255
¿En qué necesitas ayuda?
¿En leer archivos de texto? ¿En escoger una palabra de ese texto?

Comienza tú un código, llega hasta donde puedas y dinos donde te atascas.

256
Podrías ayudarme esto es lo que me pide a mi en la aplicación:
Es el mismo problema por favor

La aplicación debe contener:
 
•   Ventana que permita ingresar un socio nuevo con los objetos gráficos necesarios para el ingreso de lo descrito anteriormente.
.........

Con las clases que he publicado antes, prácticamente ya se tiene la parte del "Modelo".
Intenta comenzar una Vista y te ayudamos donde te atasques.

Si encuentro tiempo, intentaría comenzar yo una interfaz que sirviera de ejemplo... pero el tiempo escasea....  :(

257
Sobre la clase principal....
Aquí tendremos un ArrayList para cada entidad que vamos a gestionar: socios, libros, autores y prestamos.

El programa ofrecerá un menú con varias opciones y según lo que elija el usuario, llamaremos a distintos métodos que se encargarán de esa tarea específica.

Mi tiempo es muy escaso, así que he comenzado parte del programa en modo consola pero no está completo.
He escrito los métodos para las tareas de gestionar socios y gestionar prestamos.

Registrar socios consiste en pedir los datos necesarios para construir un socio y añadirlo al ArrayList. Así de fácil.
En mi código, he hecho que el código de socio se autogenere al registrar el socio siguiendo un formato (SC000x) y así garantizar que todos los socios tiene codigos distintos.
Pero vamos, se podría haber hecho simplemente pidiéndolo por teclado.


Para prestar un libro, podemos empezar pidiendo el código del socio.
Buscamos en el ArrayList el socio correspondiente, si no existe avisamos al usuario.
Si existe, lo referenciamos en una variable para tenerlo más a mano.

Ahora pedimos código del libro.
Comprobamos que existe un libro con ese código y que además esta disponible.
Si lo está, también lo referenciamos en otra variable..

Y ahora por último pedimos la fecha.
Con esos datos, ya podemos crear un objeto Prestamo y añadirlo al ArrayList.

Al socio, que tenemos referenciado en una variable, le añadimos el Libro a su ArrayList donde le apuntamos los libros que tiene en posesión.

Y al libro, cambiamos el valor de su atributo "estaDisponible" a false, para que quede constancia de que este libro está prestado y no puede volverse a prestar hasta que se devuelva.

En fin, dejo aquí el código. Pregunta si algo no se entiende bien.
E intenta completar el resto de opciones del menú, todas las que puedas.

Para facilitar el trabajo, he puesto un método que al iniciar el programa, automáticamente se registran algunos socios, autores y libros.
Así evitamos que cada vez que queramos probar el programa, tengamos que estar registrando datos por teclado.

Código: [Seleccionar]
public class Biblioteca {

private static ArrayList<Socio> socios = new ArrayList<Socio>();
private static ArrayList<Autor> autores = new ArrayList<Autor>();
private static ArrayList<Libro> libros = new ArrayList<Libro>();
private static ArrayList<Prestamo> prestamos = new ArrayList<Prestamo>();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

comenzarConDatosCargados();

String opcion = "";

while (!opcion.equals("0")) {
System.out.println("\n\t\tBIBLIOTECA");
System.out.println("\t\t----------\n");
System.out.println("\tSOCIOS");
System.out.println("[1] --- Registrar Socio");
System.out.println("[2] --- Listar Socios");
System.out.println("[3] --- Ver Socios No confiables");
System.out.println("\tAUTORES");
System.out.println("[4] --- Registrar Autor");
System.out.println("[5] --- Listar Autores");
System.out.println("[6] --- Listar Libros de un Autor");
System.out.println("\tLIBROS");
System.out.println("[7] --- Registrar Libro");
System.out.println("[8] --- Localizar Libro");
System.out.println("[9] --- Cambiar Localizacion de un Libro");
System.out.println("\tPRESTAMOS");
System.out.println("[10] -- Prestar un Libro");
System.out.println("[11] -- Devolver un Libro");
System.out.println("[12] -- Listar Prestamos actuales");
System.out.println("\n[0] --- TERMINAR PROGRAMA");
System.out.print("Opcion: ");
opcion = teclado.nextLine();

switch(opcion) {
case "0":
System.out.println("\n\n\t\tFIN DE PROGRAMA");
break;
case "1":
registrarSocio();
break;
case "2":
listarSocios();
break;
case "3":
verSociosNoConfiables();
break;
case "4":
System.out.println("\nOpcion en contruccion...\n");
break;
case "5":
System.out.println("\nOpcion en contruccion...\n");
break;
case "6":
System.out.println("\nOpcion en contruccion...\n");
break;
case "7":
System.out.println("\nOpcion en contruccion...\n");
break;
case "8":
System.out.println("\nOpcion en contruccion...\n");
break;
case "9":
System.out.println("\nOpcion en contruccion...\n");
break;
case "10":
prestarLibro();
break;
case "11":
devolverLibro();
break;
case "12":
listarPrestamos();
break;
default:
System.out.println("Opcion equivocada");
}
}

}

private static void registrarSocio() {
System.out.println("\n\tNUEVO SOCIO");
System.out.print("Cedula: ");
String cedula = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Telefono movil: ");
String telefM = teclado.nextLine();
System.out.print("Telefono convencional: ");
String telefC = teclado.nextLine();
//Construimos Direccion
Direccion direccion = new Direccion();
System.out.print("Calle Principal: ");
direccion.callePrincipal = teclado.nextLine();
System.out.print("Calle Secundaria: ");
direccion.calleSecundaria = teclado.nextLine();
System.out.print("Numero: ");
direccion.numero = teclado.nextLine();
System.out.print("Elija tipo de vivienda: ");
for (TipoVivienda tv: TipoVivienda.values())
System.out.print(tv + " ");
TipoVivienda tipo = null;
//Este bucle pide el tipo vivienda hasta que se de uno válido
while (tipo == null) {
System.out.print("\nTipo Vivienda: ");
tipo = TipoVivienda.convertirCadena(teclado.nextLine());
if (tipo == null)
System.out.print("Tipo de vivienda no es válido");
}
direccion.vivienda = tipo;
//Tenemos todos los datos para construir un socio
//El ID lo generamos según el tamaño del ArrayList con un formato SC0000x
String id = String.format("SC%04d", socios.size());
socios.add(new Socio(id, cedula, nombre, apellidos, telefM, telefC, direccion));
}

private static void listarSocios() {
if (socios.isEmpty())
System.out.println("No hay socios registrados");
else
for (Socio s: socios)
System.out.println("\n" + s);
}

private static void verSociosNoConfiables() {
if (socios.isEmpty())
System.out.println("No hay socios registrados");
else {
boolean todosConfiables = true; //Sirve para controlar si hemos encontrado socios no confiables
System.out.println("\n\tSOCIOS NO CONFIABLES");
for (Socio s: socios)
if (!s.esConfiable()) {
todosConfiables = false;
System.out.print("\nN. Socio: " + s.getNumSocio());
System.out.println("\tNombre: " + s.getNombre() + " " + s.getApellidos());
System.out.println("Libros en posesion:");
s.listarLibrosPrestados();
}

if(todosConfiables)
System.out.println("En estos momentos todos los socios son confiables.");
}
}

private static void prestarLibro() {
System.out.println("\n\tPRESTAR UN LIBRO");
System.out.print("Indique numero de socio: ");
String nSocio = teclado.nextLine();
//Buscamos el socio
Socio soc = null;
for (Socio s: socios)
if (s.getNumSocio().equals(nSocio))
soc = s;

if (soc == null)
System.out.println("No existe socio con ese numero.");
else {
System.out.print("Indique codigo del libro: ");
String cLibro = teclado.nextLine();
//Buscamos el libro
Libro lib = null;
for (Libro l: libros)
if (l.getCodigo().equals(cLibro))
lib = l;

if (lib == null)
System.out.println("No hay libro con ese codigo");
else if (!lib.estaDisponible())
System.out.println("Libro no esta disponible");
else {
System.out.print("Indique la fecha: ");
String fecha = teclado.nextLine();
//Registramos el prestamo
prestamos.add(new Prestamo(cLibro, nSocio, fecha));
//Libro prestado, deja de estar disponible
lib.setDisponible(false);
soc.prestarLibro(lib);
System.out.println("\nPrestamo completado.\n");
}

}
}

private static void devolverLibro() {
System.out.println("\n\tDEVOLVER UN LIBRO");
System.out.print("Indique codigo de libro: ");
String cLibro = teclado.nextLine();
//Buscamos libro
Libro lib = null;
for (Libro l: libros)
if (l.getCodigo().equals(cLibro))
lib = l;

if (lib == null)
System.out.println("No se encuentra libro con ese codigo");
else if (lib.estaDisponible())
System.out.println("Este libro no esta prestado a ningun socio");
else {
//Buscamos el prestamo de este libro
Prestamo pres = null;
for (Prestamo p: prestamos)
if (p.getCodigoLibro().equals(cLibro))
pres = p;
//Y ahora buscamos el socio que posee este libro
Socio soc = null;
for (Socio s: socios)
if (s.getNumSocio().equals(pres.getNumSocio()))
soc = s;

//Eliminamos el prestamo
prestamos.remove(pres);
//Eliminamos el libro de la lista del socio
soc.devolverLibro(lib);
//Libro pasa a estar disponible
lib.setDisponible(true);
System.out.println("\nPrestamo devuelto");
}
}

private static void listarPrestamos() {
System.out.println("\n\tPRESTAMOS ACTUALES");
if (prestamos.isEmpty())
System.out.println("No hay Prestamos registrados.");
else
for (Prestamo p: prestamos)
System.out.println(p + "\n");
}

/*
* Este método carga algunos datos por defecto
* para poder hacer pruebas en el programa
*/
private static void comenzarConDatosCargados() {
//Algunos socios
String id = String.format("SC%04d", socios.size());
socios.add(new Socio(id, "CED001", "Juan", "Marin Roca", "678901234", "994567890",
new Direccion("Sepulveda", "Roble", "34", TipoVivienda.CASA)));
id = String.format("SC%04d", socios.size());
socios.add(new Socio(id, "CED002", "Sara", "Montes", "678901234", "994567890",
new Direccion("Azucena", "", "44", TipoVivienda.DEPARTAMENTO)));
id = String.format("SC%04d", socios.size());
socios.add(new Socio(id, "CED003", "Jorge", "Morales", "678901234", "994567890",
new Direccion("Peru", "Ecuador", "11", TipoVivienda.EMPRESA)));
id = String.format("SC%04d", socios.size());
socios.add(new Socio(id, "CED004", "Laura", "Sanchez", "678901234", "994567890",
new Direccion("Fresnedo", "", "67", TipoVivienda.DEPARTAMENTO)));
//Algunos libros
libros.add(new Libro("978834556", "Cien años de soledad", "Gabriel Garcia Marquez", true,
new Localizacion("2", "4", "6", Area.ARTE_LITERATURA)));
libros.add(new Libro("978878912", "Lecturas y Pasiones", "Jose Luis Melero", true,
new Localizacion("1", "4", "5", Area.FILOLOGIA)));
libros.add(new Libro("978800781", "Sunies y Chiies", "Javier Martin", true,
new Localizacion("3", "3", "1", Area.RELIGION)));
libros.add(new Libro("978815690", "Salafismo", "Luz Gomez", true,
new Localizacion("3", "3", "2", Area.RELIGION)));
libros.add(new Libro("978813456", "Steven Universe Juego de Rol", "Rebecca Sugar", true,
new Localizacion("2", "3", "7", Area.GENERALIDADES)));
libros.add(new Libro("978890908", "Somos agua que piensa", "Joaquin Araujo", true,
new Localizacion("2", "8", "3", Area.CIENCIAS_NATURALES)));
//Correspondientes autores
Autor autor = new Autor("Gabriel Garcia Marquez", "Gabo", "Colombia", "6/3/1927");
autor.agregarLibro(libros.get(0));
autores.add(autor);
autor = new Autor("Jose Luis Melero", "", "España", "12/7/1956");
autor.agregarLibro(libros.get(1));
autores.add(autor);
autor = new Autor("Javier Martin", "", "Argentina", "11/9/1963");
autor.agregarLibro(libros.get(2));
autores.add(autor);
autor = new Autor("Luz Gomez", "", "España", "1/2/1969");
autor.agregarLibro(libros.get(3));
autores.add(autor);
autor = new Autor("Rebecca Sugar", "Sugar", "Estados Unidos", "9/7/1987");
autor.agregarLibro(libros.get(4));
autores.add(autor);
autor = new Autor("Joaquin Araujo", "", "España", "31/12/1947");
autor.agregarLibro(libros.get(5));
autores.add(autor);
}

}

258
No se como implementar para hacer el registro de socios y que me aprezca a quien se presta el libro
es en Java Netbeans

A ver, en este programa intervienen muchas clases

Tenemos la clase Socio, que entre sus atributos, los datos de la dirección pueden agruparse a su vez en otra clase llamada Direccion.
No hace falta que sea una clase completa con getters y setters, podemos dejar sus atributos accesibles, sin encapsular, para acceder a ellos directamente.
Hay un atributo, el de "Tipo de Vivienda", que ya nos dan una serie de valores entre los que se debe elegir.
Por tanto, deberíamos establecer una forma para controlar que ese atributo solo reciba uno de esos valores indicados.

Una forma de hacerlo, es creando un ENUM..., que es muy parecido a una clase normal, pero con la diferencia de que "enumeramos" los únicos objetos que van a poder existir de esta clase/enum.
Este enum podemos llamarlo TipoVivienda
Código: [Seleccionar]
public enum TipoVivienda {

CASA("Casa"), DEPARTAMENTO("Departamento"),
OFICINA("Oficina"), EMPRESA("Empresa");

private String valor;

private TipoVivienda(String tipo) {
valor = tipo;
}

@Override
public String toString() {
return valor;
}

/*
* Recibe una cadena y comprueba a que enumerado
* corresponde. Una vez encontrado, lo retorna.
* Si no encuentra ninguno valido, retorna null.
*/
public static TipoVivienda convertirCadena(String cadena) {
for (TipoVivienda tv: TipoVivienda.values())
if (tv.valor.equalsIgnoreCase(cadena))
return tv;

return null;
}

}
A este enum, le damos además un método estático que se encargue de recibir una cadena y retornar el objeto que se corresponda aunque no coincidan las mayúsculas.
Así, dará igual si el usuario teclea casa, CASA, cASA, CaSa, casA....
Para cualquiera de esas cadenas, obtendremos el objeto CASA, cuyo valor String es "Casa".

Así que este enum, será un atributo de la clase Direccion
Código: [Seleccionar]
public class Direccion {

String callePrincipal;
String calleSecundaria;
String numero;
TipoVivienda vivienda;

public Direccion() {
callePrincipal = "";
calleSecundaria = "";
numero = "";
vivienda = null;
}

public Direccion(String callePrincipal, String calleSecundaria, String numero, TipoVivienda vivienda) {
this.callePrincipal = callePrincipal;
this.calleSecundaria = calleSecundaria;
this.numero = numero;
this.vivienda = vivienda;
}

@Override
public String toString() {
return String.format("Calle Principal: %s\nCalle Secundaria: %s\n"
+ "Numero: %s\nTipo Vivienda: %s", callePrincipal, calleSecundaria,
numero, vivienda);
}
}
Como dijimos, sus atributos están "desprotegidos" para que sea más cómodo acceder a ellos. Y no importa porque ya quedarán protegidos cuando esta clase se implemente como atributo de la clase Socio
Código: [Seleccionar]
public class Socio {

private String numSocio;
private String cedula;
private String nombre;
private String apellidos;
private String telefMovil;
private String telefConvencional;
private Direccion direccion;
private ArrayList<Libro> libros;

public Socio(String numSocio, String cedula, String nombre, String apellidos,
String telefMovil, String telefConvencional, Direccion direccion) {
this.numSocio = numSocio;
this.cedula = cedula;
this.nombre = nombre;
this.apellidos = apellidos;
this.telefMovil = telefMovil;
this.telefConvencional = telefConvencional;
this.direccion = direccion;
libros = new ArrayList<Libro>();
}

public String getNumSocio() {
return numSocio;
}

public void setNumSocio(String numSocio) {
this.numSocio = numSocio;
}

public String getCedula() {
return cedula;
}

public void setCedula(String cedula) {
this.cedula = cedula;
}

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 getTelefMovil() {
return telefMovil;
}

public void setTelefMovil(String telefMovil) {
this.telefMovil = telefMovil;
}

public String getTelefConvencional() {
return telefConvencional;
}

public void setTelefConvencional(String telefConvencional) {
this.telefConvencional = telefConvencional;
}

public Direccion getDireccion() {
return direccion;
}

public void setDireccion(Direccion direccion) {
this.direccion = direccion;
}

public boolean esConfiable() {
return libros.size() <= 10;
}

public void listarLibrosPrestados() {
for (Libro l: libros) {
System.out.print("--> Codigo: " + l.getCodigo());
System.out.println("\tTitulo: " + l.getTitulo());
}
}

public void prestarLibro(Libro l) {
libros.add(l);
}

public void devolverLibro(Libro l) {
libros.remove(l);
}

@Override
public String toString() {
return String.format("Num Socio: %s\tCedula: %s\nNombre: %s Apellidos: %s\n"
+ "Telef. Movil: %s\tTelef. Convencional: %s\nDatos Direccion:\n%s",
numSocio, cedula, nombre, apellidos, telefMovil, telefConvencional, direccion);
}

}
Esta clase tiene los atributos que pide el enunciado y además un ArrayList donde se coleccionarán los libros que el socio tenga prestados.
Tiene métodos para poder prestarle un libro y retornar el libro prestado.
Otro método nos dice con un boolean si el usuario es confiable (tiene 10 o menos libros prestados) y otro lista en pantalla los libros que pueda tener prestados.

Luego tenemos la clase Libro y ocurre algo parecido como con Socio.
Uno de sus atributos es la Localización del libro, que es un dato compuesto por varios atributos así que podemos agruparlos en una única clase.
Y uno de esos atributos, el "area", también se nos dan una serie de valores determinados entre los que se puede escoger.
Así que también podemos modelar un enum para el dato de Area
Código: [Seleccionar]
public enum Area {

GENERALIDADES("Generalidades"), FILOSOFIA("Filosofia"), RELIGION("Religion"),
CIENCIAS_SOCIALES("Ciencias Sociales"),
FILOLOGIA("Filologia"), CIENCIAS_NATURALES("Ciencias Naturales"),
TECNICA_CIENCIA_PRACTICA("Tecnica y Ciencia Practica"),
ARTE_LITERATURA("Arte y Literatura"), HISTORIA("Historia");

private String valorArea;

private Area(String tipo) {
valorArea = tipo;
}

@Override
public String toString() {
return valorArea;
}

public static Area convertirCadena(String cadena) {
for (Area a: Area.values())
if (a.valorArea.equalsIgnoreCase(cadena))
return a;

return null;
}
}
Este enum, será un atributo de la clase Localizacion
Código: [Seleccionar]
public class Localizacion {

String numPiso;
String numHabitacion;
String numEstante;
Area area;

public Localizacion() {
numPiso = "";
numHabitacion = "";
numEstante = "";
area = null;
}

public Localizacion(String numPiso, String numHabitacion, String numEstante, Area area) {
this.numPiso = numPiso;
this.numHabitacion = numHabitacion;
this.numEstante = numEstante;
this.area = area;
}

@Override
public String toString() {
return String.format("Piso: %s\tHabitacion: %s\nEstante: %s\tArea: %s", numPiso,
numHabitacion, numEstante, area);
}

}
Y esta clase, será un atributo de la clase Libro
Código: [Seleccionar]
public class Libro {

private String codigo;
private String titulo;
private String autoria;
private boolean estaDisponible;
private Localizacion localizacion;

public Libro(String codigo, String titulo, String autoria, boolean estaDisponible,
Localizacion localizacion) {
this.codigo = codigo;
this.titulo = titulo;
this.autoria = autoria;
this.estaDisponible = estaDisponible;
this.localizacion = localizacion;
}

public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getAutoria() {
return autoria;
}
public void setAutoria(String autoria) {
this.autoria = autoria;
}
public boolean estaDisponible() {
return estaDisponible;
}
public void setDisponible(boolean disponibilidad) {
estaDisponible = disponibilidad;
}

public Localizacion getLocalizacion() {
return localizacion;
}

public void setLocalizacion(Localizacion localizacion) {
this.localizacion = localizacion;
}

@Override
public String toString() {
return String.format("Codigo: %s\tTitulo: %s\nAutoria: %s Disponible: %s\nLocalizacion:\n%s",
codigo, titulo, autoria, estaDisponible?"Si":"No", localizacion);
}

/*
* Dos libros son iguales si tienen el mismo codigo.
*/
@Override
public boolean equals(Object objeto) {
if (objeto instanceof Libro) {
Libro otroLibro = (Libro) objeto;
return codigo.equals(otroLibro.codigo);
}
else
return false;
}
}
Para esta clase, nos conviene sobre escribirle el método equals() para indicar cuando dos libros deben considerarse como iguales.
Esto luego servirá para que se más fácil eliminar libros del ArrayList del socio, cuando este devuelva su préstamo.

Otra clase que interviene aquí, es la clase Autor, a quien podemos ponerle también un ArrayList para agrupar los libros que este autor ha escrito.
Código: [Seleccionar]
public class Autor {

private String nombre;
private String alias;
private String nacionalidad;
private String fechaNaci;
private ArrayList<Libro> libros;

public Autor(String nombre, String alias, String nacionalidad, String fechaNaci) {
this.nombre = nombre;
this.alias = alias;
this.nacionalidad = nacionalidad;
this.fechaNaci = fechaNaci;
libros = new ArrayList<Libro>();
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public String getAlias() {
return alias;
}

public void setAlias(String alias) {
this.alias = alias;
}

public String getNacionalidad() {
return nacionalidad;
}

public void setNacionalidad(String nacionalidad) {
this.nacionalidad = nacionalidad;
}

public String getFechaNaci() {
return fechaNaci;
}

public void setFechaNaci(String fechaNaci) {
this.fechaNaci = fechaNaci;
}

public void agregarLibro(Libro lib) {
libros.add(lib);
}

public void listarLibros() {
for (Libro l: libros)
System.out.println(l);
}

@Override
public String toString() {
return String.format("Nombre: %s\tAlias: %s\nNacionalidad: %s\tFecha Nacimiento: %s",
nombre, alias, nacionalidad, fechaNaci);
}

}

Y nos queda la clase Prestamo, a quién también le sobreescribiremos el método equals(), ya que en la clase principal tendremos un ArrayList con prestamos, y habrá que eliminarlos cuando los libros sean devueltos.

Código: [Seleccionar]
public class Prestamo {

private String codigoLibro;
private String numSocio;
private String fecha;

public Prestamo(String codigoLibro, String numSocio, String fecha) {
this.codigoLibro = codigoLibro;
this.numSocio = numSocio;
this.fecha = fecha;
}

public String getCodigoLibro() {
return codigoLibro;
}

public void setCodigoLibro(String codigoLibro) {
this.codigoLibro = codigoLibro;
}

public String getNumSocio() {
return numSocio;
}

public void setNumSocio(String numSocio) {
this.numSocio = numSocio;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

@Override
public String toString() {
return String.format("Codigo Libro: %s\tNumero Socio: %s\nFecha: %s", codigoLibro,
numSocio, fecha);
}

/*
* Dos prestamos se consideran iguales si coincide el codigo de libro
* y el codigo de socio
*/
@Override
public boolean equals(Object objeto) {
if (objeto instanceof Prestamo) {
Prestamo otroPrestamo = (Prestamo) objeto;
return codigoLibro.equals(otroPrestamo.codigoLibro) && numSocio.equals(otroPrestamo.numSocio);
}
else
return false;
}

}

En el siguiente mensaje vemos la clase principal

259
Veamos..
Unas páginas más atrás, publiqué las clases necesarias para realizar este ejercicio.
No las puse todas, dejé sin publicar dos de las clases "gestoras" para que fueran desarrolladas por la persona que abrió este hilo.
Esas dos clases se podían desarrollar fácilmente tomando como ejemplo una de las que puse.
Yo publiqué la clase que se encarga de gestionar pacientes, faltaban las clases para gestionar médicos e historiales clínicos. Y como digo, para hacer esas clases básicamente es copiar la clase que sí puse y modificarla para adaptarla a Médicos e Historiales.

Tampoco hice una clase principal con menús y submenús, ya que también lo deje para que lo desarrollase el autor de este hilo.

Bien, puedo comenzar ahora esta clase principal, pero sin completarla. Solo poner el suficiente código para que pueda tomarse como ejemplo y poder hacer el resto, ya que no me corresponde a mí escribirlas ni creo que sea una ayuda real darlo todo ya terminado.

En esta clase principal, comienzo declarando como atributos tres objetos de las clases "gestoras".
Muestro el menú principal con un JOptionPane (ya que así comenzamos a desarrollar este programa) y con un switch evaluamos la elección del usuario.
Dentro del switch, según el caso, llamaremos a los métodos que se encargarán de mostrar los submenús.

Estos submenús serán similares al menú principal, lo mostramos con JOptionPane, recogemos respuesta y evaluamos con switch.
Según lo que se elija, pediremos a la clase gestora correspondiente que realice la operación solicitada: registrar un paciente, modificarlo, etc...

Pongo el código con el menú principal y el submenú para gestionar pacientes. Tomando este como ejemplo, se pueden escribir los otros submenús.

Fijaos que el texto de los menús de los JOptionPane los declaro al final del programa en unos String. Esto es para que los métodos no tengan exceso de líneas y sean más legibles, por eso a parto el texto de los String al final de todo, donde no molesten.

Código: [Seleccionar]
import javax.swing.JOptionPane;

public final class TestClinica {

//Clases "gestoras"
static GestorPacientes pacientes = new GestorPacientes();
static GestorMedicos medicos = new GestorMedicos();
static GestorHistorial historiales = new GestorHistorial();

public static void main(String[] args) {

String opcion = "";

while (!opcion.equals("4")) {
opcion = JOptionPane.showInputDialog(null, TEXTO_MENU_PR,
"Menu Clinica", JOptionPane.QUESTION_MESSAGE);
switch(opcion) {
case "1":
gestionarPacientes();
break;
case "2":
//gestionarMedicos();
break;
case "3":
//gestionarHistoriales();
break;
case "4":
JOptionPane.showMessageDialog(null, "FIN DE PROGRAMA", "Menu Clinica",
JOptionPane.INFORMATION_MESSAGE);
break;
default:
JOptionPane.showMessageDialog(null, "Opción equivocada", "Menu Clinica",
JOptionPane.ERROR_MESSAGE);
}
}

}

//Métodos para mostrar los submenús
static void gestionarPacientes() {
String opcion = "";

while (!opcion.equals("5")) {
opcion = JOptionPane.showInputDialog(null, TEXTO_MENU_GP,
"Gestion Pacientes", JOptionPane.QUESTION_MESSAGE);
switch(opcion) {
case "1":
pacientes.nuevoPaciente();
break;
case "2":
pacientes.mostrarPacientes();
break;
case "3":
pacientes.modificarPaciente();
break;
case "4":
pacientes.borrarPaciente();
break;
case "5":
JOptionPane.showMessageDialog(null, "Volviendo al Menu Principal", "Gestion Pacientes",
JOptionPane.INFORMATION_MESSAGE);
break;
default:
JOptionPane.showMessageDialog(null, "Opción equivocada", "Menu Clinica",
JOptionPane.ERROR_MESSAGE);
}
}
}

//Textos para los menus JOptionPane
static final String TEXTO_MENU_PR = "[1] - Gestionar Pacientes\n[2] - Gestionar Medicos"
+ "\n[3] - Gestionar Historiales\n[4] - Salir";
static final String TEXTO_MENU_GP = "[1] - Registrar Pacientes\n[2] - Mostrar Pacientes"
+ "\n[3] - Modificar Pacientes\n[4] - Eliminar Pacientes\n[5] - Volver";

}

260
¿Y en que parte tienes problemas?
¿Qué es lo que no entiendes?

¿Qué clases has identificado tú? Es evidente que habrá que escribir las clases Socio y Libro.
Pero, ¿hay más clases?

¿Y en que lenguaje tienes que escribirlo? ¿En modo texto/consola o con interfaz gráfica?

Páginas: 1 ... 8 9 10 11 12 [13] 14 15 16 17 18 ... 50

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".