Kabuto: Clase
AgendaSerá un ArrayList de objetos
ContactoHe programado las opciones básicas:
- Añadir contacto.
Recibe un objeto Contacto y lo registra. A no ser que ya exista otro con el mismo correo, en cuyo caso rechazará el nuevo Contacto.
El ArrayList se vale de manera interna (no lo vemos en el código) del método equals() que escribimos en la clase
Contacto para poder comprobar esto.
- Eliminar contacto
Recibe un String con el correo del contacto a eliminar.
Si lo encuentra, lo elimina. Si no, informa de que no existe.
- Buscar contacto
Recibe un String con el correo del contacto a buscar.
Si lo encuentra, lo retorna. Si no, informa que no existe y retorna un valor
nullEste método será útil después para mostrar un contacto en concreto y también para modificarlo.
- Mostrar una lista de contactos registrados.
Si la lista no está vacía, recorrerá todos los contactos del ArrayList y los mostrará.
Aquí entra en juego el método
toString() que escribimos anteriormente. Gracias a él, cada objeto
Contacto sabe cómo ha de mostrarse en pantalla, no es necesario pedir datos a los getters para mostrarlos.
No tiene mayor misterio la verdad, pregunta lo que no te quede claro.
import java.util.ArrayList;
public class Agenda {
private ArrayList<Contacto> agenda;
public Agenda() {
agenda = new ArrayList<Contacto>();
}
public void anadirContacto(Contacto contacto) {
if (agenda.contains(contacto)) { //Ya hay un contacto equivalente(con el mismo correo)
System.out.println("Ya existe un Contacto con el correo: " + contacto.getCorreo());
System.out.println("Registro rechazado");
}
else {
agenda.add(contacto); //Lo aceptamos
System.out.println("Registro aceptado");
}
}
public void eliminarContacto(String correo) {
//Referencia para el contacto que vamos a buscar
Contacto buscar = null;
//Buscamos el contacto
for (Contacto cont: agenda)
if (cont.getCorreo().equals(correo)) {//Encontrado
buscar = cont; //Lo referenciamos
break; //Ponemos fin a la búsqueda
}
//Comprobamos si se ha encontrado, en cuyo caso será eliminado
if (buscar == null)
System.out.println("No existe ningún Contacto con el correo: " + correo);
else {
agenda.remove(buscar); //Eliminamos el contacto buscado
System.out.println("Contacto eliminado.");
}
}
public Contacto obtenerContacto(String correo) {
//Buscamos el contacto
for (Contacto cont: agenda)
if (cont.getCorreo().equals(correo)) {//Encontrado
return cont; //Lo retornamos, aquí finalizaría este método
}
//Si el bucle for ha finalizado sin retornar nada, es que no existe contacto con ese correo
System.out.println("No existe ningún Contacto con el correo: " + correo);
return null;
}
public void listarContactos() {
System.out.println("\n\t\tAGENDA DE CONTACTOS");
System.out.println("\t\t------ -- ---------\n");
if (agenda.isEmpty())
System.out.println("No hay contactos registrados.");
else {
//Antes de listar, ordenamos por apellidos
agenda.sort(null);//Pasamos valor null porque los Contactos ya saben como han de ordenarse
for (Contacto cont: agenda) {
System.out.println("\t\t******");
System.out.println(cont); //Grácias al método toString(), con esto basta para mostrar los datos
System.out.println("\t\t******\n");
}
}
}
}
Y por último la clase
MainPara facilitar las cosas declaramos un objeto Agenda y un Scanner como variables de "ámbito global", es decir, fuera del método main().
De esta manera, estos objetos son visibles en TODA la clase principal, así los distintos métodos "secundarios" que harán tareas específicas, podrán acceder directamente a la "agenda" y al Scanner.
El método main() consistirá en un bucle que muestra el menú de opciones, pide opción al usuario y mediante un switch decide a qué método secundario hay que llamar.
Los método secundarios son los que hacen todo el trabajo: piden datos, registran contactos, eliminan, modifican y validan que el correo electrónico cumpla con el formato adecuado.
Por cierto, la expresión regular de tu código es incorrecta, en algunos rangos de a y z minúsculas, pone la Z mayúscula, invalidando esos rangos.
Es decir, las letras que marco en rojo, deberían ser z minúsculas, no mayúsculas
"^[_A-Za-Z0-9-\\+]+(\\.[_A-Za-Z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-Z0-9]+)*(\\.[A-Za-z]{2,})$"
Verás que la validación del correo la hago un poco distinto. No uso un objeto
Pattern. Se podría usar, pero la clase String ya tiene un método llamado
matches() al que directamente le podemos pasar la expresión regular sin tener que compilarla en un
PatternTe dejo el código, comprueba su funcionamiento y pregunta lo que no entiendas.
Cuando lo tengas claro, intenta añadir nuevas funcionalidades a la agenda. Si te atascas, comparte por aquí tu código y te seguimos ayudando.
Un saludo.
import java.util.Scanner;
public class Main {
//Variables/objetos de ámbito global
private static Agenda agenda = new Agenda();
private static Scanner teclado = new Scanner(System.in);
//Método principal
public static void main(String[] args) {
char opcion = ' ';
while (opcion != '9') {
mostrarMenu();
opcion = teclado.nextLine().charAt(0);
switch(opcion) {
case '1':
registrarContacto();
break;
case '2':
eliminarContacto();
break;
case '3':
modificarContacto();
break;
case '4':
buscarContacto();
break;
case '5':
agenda.listarContactos();
break;
case '9':
System.out.println("\n\n\t\tFIN DE PROGRAMA");
break;
default:
System.out.println("Opción inválida");
}
}
}
//Métodos secundarios
private static void mostrarMenu() {
System.out.println("\n\t\tMENU AGENDA");
System.out.println("\t\t---- ------\n");
System.out.println("[1] -- Registrar Contacto");
System.out.println("[2] -- Eliminar Contacto");
System.out.println("[3] -- Modificar Contacto");
System.out.println("[4] -- Buscar Contacto");
System.out.println("[5] -- Listar Agenda");
System.out.println("[9] -- TERMINAR PROGRAMA");
System.out.print("Elija opción: ");
}
private static void registrarContacto() {
//Pedimos datos
System.out.println("\n\tNUEVO CONTACTO\n");
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Teléfono: ");
String telefono = teclado.nextLine();
System.out.print("Correo: ");
String correo = pedirCorreo();
//Intentamos registrarlo
agenda.anadirContacto(new Contacto(nombre, apellidos, telefono, correo));
}
private static void eliminarContacto() {
System.out.println("Indique correo del contacto a eliminar.");
System.out.print("Correo: ");
String correo = pedirCorreo();
agenda.eliminarContacto(correo);
}
private static void modificarContacto() {
System.out.println("Indique correo del contacto a modificar.");
System.out.print("Correo: ");
String correo = pedirCorreo();
//Buscamos el contacto
Contacto modificar = agenda.obtenerContacto(correo);
if (modificar != null) {
System.out.println("Datos actuales del Contacto:\n");
System.out.println(modificar);
System.out.println("\nA continuación introduzca los nuevos datos que quiera modificar.");
System.out.println("Si algún dato no quiere modificarlo, pulse ENTER dejando el campo vacío.");
//Pedimos datos nuevos, si deja campos vacios, entonces no modificaremos esos datos
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
if (!nombre.isBlank())
modificar.setNombre(nombre);
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
if (!apellidos.isBlank())
modificar.setApellidos(apellidos);
System.out.print("Teléfono: ");
String telefono = teclado.nextLine();
if (!telefono.isBlank())
modificar.setTelefono(telefono);
/*
* Modificar el correo es un poco más difícil
* porque ha de cumplir un patrón determinado,
* pero en este caso, podemos aceptar un campo vacío.
* El campo vacío no cumple el patrón, pero se acepta
* porque significa que el usuario no quiere modificar
* el correo ya existente.
*/
boolean aceptado = false;
while(!aceptado) {
System.out.print("Correo: ");
correo = teclado.nextLine();
if (correo.isBlank()) //No quiere modificar
aceptado = true;
else { //Quiere modificar, pero ha de ser un correo validado
if (validarCorreo(correo)) {
modificar.setCorreo(correo);
aceptado = true;
}
else
System.out.println("Correo no válido. Intente de nuevo.");
}
}
System.out.println("\nModificación completada");
}
}
private static void buscarContacto() {
System.out.println("Indique correo del contacto a buscar.");
System.out.print("Correo: ");
String correo = pedirCorreo();
//Buscamos el contacto
Contacto buscar = agenda.obtenerContacto(correo);
if (buscar != null) {
System.out.println("Datos del Contacto:\n");
System.out.println(buscar);
}
}
private static String pedirCorreo() {
String correo = "";
while (!validarCorreo(correo)) {
correo = teclado.nextLine();
if (!validarCorreo(correo))
System.out.print("Correo no es válido. Intente de nuevo: ");
}
return correo;
}
private static boolean validarCorreo(String correo) {
String expresionRegular = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
return correo.matches(expresionRegular);
}
}