Autor Tema: programar agenda telefónica en Java añadir consultar eliminar contactos validar  (Leído 4336 veces)

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Hola a todos, reproduzco a continuación un tema que fue creado por LordFer y por Kabuto para que pueda ser consultado y servir de ayuda, gracias a ambos.

LordFer: Buenas tardes programadores, escribo en este foro ya que no encuentro solución para terminar mi código. Se trata de crear una agenda de contactos que contenga las siguientes opciones: añadir contacto, eliminarlos, lista de todos los contactos, y buscar contactos, según su apellido, nombre o correo.

Esta ultima parte es la que no se realizar, por eso les pido ayuda, ya que no tengo mucha experiencia en programación.

Les adjunto lo que llevo de código.

No se que escribir en else if (opciones equals("4"))


Main.java -->

Código: [Seleccionar]
import AgendaDef.Contacto;
import AgendaDef.Agenda;
//import AgendaDef.OrdenApellidos;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Autores:  */

public class Main{
   
    public static void main(String [] args)
    {
        Pattern pattern = Pattern
               .compile("^[_A-Za-Z0-9-\\+]+(\\.[_A-Za-Z0-9-]+)*@"
                        + "[A-Za-z0-9-]+(\\.[A-Za-Z0-9]+)*(\\.[A-Za-z]{2,})$");
                       
        /*Esto sirve para poder comprobar el correo mas adelante. Lo sacamos desde este foro
        /es.stackoverflow.com/questions/46067/expresiones-regulares-para-correo-electronico-en-java*/               
       
        imprimirOpciones();
        ControladorContactos agenda = new ControladorContactos();
       
        Scanner usuario = new Scanner(System.in);
        String opciones = usuario.next();
       
        while (opciones.equals("6"))
        {
           
            if (opciones.equals("1"))
            {
            //Aqui es donde se crea el contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado crear un contacto ");
                System.out.println("");
                System.out.print("\tIntroduce el nombre del contacto: ");
                String nombreContacto = usuario.next();
                System.out.print("\tIntroduce los apellidos del contacto: ");
                String apellidos = usuario.next();
                System.out.print("\tIntroduce el numero de telefono del contacto: ");
                String telefono = usuario.next();
                System.out.print("\tIntroduce el correo electronico de la persona: ");
                String correo = usuario.next();
               
                //Con el codigo de la linea 14 se comprueba el correo//
                Matcher mather = pattern.matcher(correo);
                if (mather.find() == true)
                {
               
                if (agenda.comprobarContacto(correo))
                {
                    Contacto contactoCorrecto = new Contacto (nombreContacto, apellidos, telefono, correo);
                    agenda.anadirContacto(contactoCorrecto);
                    System.out.println("El contacto se ha guardado correctamente. ");
                }
                else
                {
                    System.out.println("No se puede guardar el correo, ya existe uno igual.");
                }
               
                }
            } 
           
            else if (opciones.equals("2"))
            {
                //Eliminar un contacto
                System.out.println("******************************");
                System.out.println("Ha seleccionado eliminar un conctacto");
                System.out.println("");
                System.out.println("\tIntroduce el correo del contacto que quieres borrar: ");
                String correo = usuario.next();
               
                if (agenda.eliminarContacto(correo))
                {
                    System.out.println("El contacto ha sido eliminado.");
                }
               
                else
                {
                    System.out.println("No existe ningun contacto con ese correo");
                }
               
                volverMenu();
            }
             
            else if (opciones.equals("3"))
            {
                //Editar un contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado editar un contacto");
                System.out.println("");
                System.out.println("\tIntroduzca el correo del contacto que desea editar");
                String correo = usuario.next();
               
                if (agenda.comprobarContacto(correo))
                {
                    System.out.println("Elija que valor desea editar: ");
                    System.out.println("\t a. Cambiar nombre");
                    System.out.println("\t b. Cambiar los apellidos");
                    System.out.println("\t c. Cambiar el telefono");
                    System.out.println("\t d. Cambiar el correo electronico");
                   
                    String opcion = usuario.next();
                    System.out.print("Introduzca de el nuevo valor: ");
                    String valor = usuario.next();
                    agenda.editarContacto(correo, opcion, valor);
                    System.out.println("Se ha actualizado el contacto con exito.");
                }
                else
                {
                    System.out.println("No existe ningun contacto con ese correo");
                }
               
                volverMenu();
            }   
           
            else if (opciones.equals("4"))
            {
                //Buscar un contacto
                System.out.println("********************************");
                System.out.println("Ha seleccionado buscar un contacto");
                System.out.println("");
                System.out.println("\tElija cual es su criterio de busqueda: ");
               
            }
           
           
            else if (opciones.equals ("5"))
            {
                System.out.println("Esta es tu agenda de contactos: ");
                for (Item _Agenda : _Agenda)
                {
                String nombreContacto = _Agenda.getNombreContacto();
                String telefono = _Agenda.getTelefono();
                String apellidos = _Agenda.getApellidos();
                String correo = _Agenda.getCorreo();
               
                System.out.println("Nombre: " + nombreContacto + apellidos + "\tTelefono: " + telefono + "\tCorreo electronico: " + correo);
                }
                System.out.println("---------------");
               
                volverMenu();
            }
            }
        }
    }





Agenda.java -->

Código: [Seleccionar]
package AgendaDef;

import java.util.ArrayList;
//import java.IOException;
import java.util.Comparator;

public final class Agenda{
    ArrayList <Contacto> _Agenda = new ArrayList <>();
    String  Contactos = "agenda.dat";
   
    public Agenda()
    {
    //Aqui es donde se inicia el array list, cuando se anada un contacto
        this._Agenda = new ArrayList <Contacto>();
    }
   
    public void anadirContacto (Contacto contacto_actual)
    {
        this._Agenda.add(contacto_actual);
    }
   
    public boolean eliminarContacto (String correo)
    {
        boolean isRemove = false;
       
        for (int i=0; i < this._Agenda.size(); i++)
        {
            Contacto actual = (Contacto) this._Agenda.get(i);
           
            if (actual.getCorreo().toLowerCase().equals(correo.toLowerCase()))
            {
                System.out.println("\tHemos eliminado: " + actual.getNombreContacto() + " " + actual.getApellidos());
                this._Agenda.remove(i);
                isRemove = true;
            }
        }
    }
   
    public ArrayList<Contacto> consultarContactoPorNombre(String nombreContacto)
    {
        ArrayList<Contacto> contactosConEseNombre = new ArrayList<Contacto> ();
        for (Contacto contactos : Contactos.getNombreContacto)
        {
            if (contactos.getNombreContacto().toLowerCase().equals(nombreContacto.toLowerCase()))
            {
                contactosConEseNombre.add(contactos);
            }
        }
        return contactosConEseNombre;     
    }
   
    public ArrayList<Contacto> consultarContactoPorApellido(String apellidos)
    {
        ArrayList<Contacto> contactosConEseApellido = new ArrayList<Contacto> ();
        for (Contacto contactos : Contactos.getApellidos)
        {
            if (contactos.getApellidos().equals(apellidos))
            {
                contactosConEseApellido.add(contactos);
            }
        }
        return contactosConEseApellido;     
    }
   
    public ArrayList<Contacto> consultarContactoPorEmail(String correo)
    {
        ArrayList<Contacto> contactosConEseEmail= new ArrayList<Contacto> ();
       
        for (Contacto contactos : Contactos.getCorreo)
        {
                if ( correo.getCorreo().equals(correo))
                {
                    contactosConEseEmail.add(contactos);
                }
           
        }
        return contactosConEseEmail;     
    }
   
    public void eliminarContacto(Contacto contactos)
    {
        for (Contacto contactos : Contacto.getNombreContacto)
        {
            if(Contactos.getNombreContacto().contains(contactos))
            {
                contacto.excluirContactoDeGrupo(contactos);
            }
        }
        contactos.remove(Contactos);
    }
   
   
   
}


Contacto.java -->

Código: [Seleccionar]
package AgendaDef;

public class Contacto{
    public String _nombreContacto;
    public String _apellidos;
    public String _telefono;
    public String _correo;
   
   
    public Contacto(String nombreContacto, String apellidos, String correo,  String telefono)
    {
        this._nombreContacto = nomnbreContacto;
        this._apellidos      = apellidos;
        this._telefono       = telefono;
        this._correo         = correo;
    }
   
    //Metodos GET
   
    public String getNombreContacto()
    {
        return this._nombreContacto;
    }
   
    public String getApellidos()
    {
        return this._apellidos;   
    }
   
    public String getTelefono()
    {
        return this._telefono;
    }
   
    public String getCorreo()
    {
        return this._correo;   
    }
   
    //Metodos SET
   
    public void setNombreContacto(String nombreContacto)
    {
        this._nombreContacto = nombreContacto;
    }
   
    public void setApellidos(String apellidos)
    {
        this._apellidos = apellidos;
    }
   
    public void setCorreo(String correo)
    {
        this._correo = correo;
    }
   
    public void setTelefono(String telefono)
    {
        this._telefono = telefono;
    }
}


Errores -->

Código: [Seleccionar]
./Root/AgendaDef/Agenda.java:42: error: cannot find symbol
        for (Contacto contactos : Contactos.getNombreContacto)
                                           ^
  symbol:   variable getNombreContacto
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:55: error: cannot find symbol
        for (Contacto contactos : Contactos.getApellidos)
                                           ^
  symbol:   variable getApellidos
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:69: error: cannot find symbol
        for (Contacto contactos : Contactos.getCorreo)
                                           ^
  symbol:   variable getCorreo
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:71: error: cannot find symbol
                if ( correo.getCorreo().equals(correo))
                           ^
  symbol:   method getCorreo()
  location: variable correo of type String
./Root/AgendaDef/Agenda.java:82: error: cannot find symbol
        for (Contacto contactos : Contacto.getNombreContacto)
                                          ^
  symbol:   variable getNombreContacto
  location: class Contacto
./Root/AgendaDef/Agenda.java:82: error: variable contactos is already defined in method eliminarContacto(Contacto)
        for (Contacto contactos : Contacto.getNombreContacto)
                      ^
./Root/AgendaDef/Agenda.java:84: error: cannot find symbol
            if(Contactos.getNombreContacto().contains(contactos))
                        ^
  symbol:   method getNombreContacto()
  location: variable Contactos of type String
./Root/AgendaDef/Agenda.java:86: error: cannot find symbol
                contacto.excluirContactoDeGrupo(contactos);
                ^
  symbol:   variable contacto
  location: class Agenda
./Root/AgendaDef/Agenda.java:89: error: cannot find symbol
        contactos.remove(Contactos);
                 ^
  symbol:   method remove(String)
  location: variable contactos of type Contacto
./Root/AgendaDef/Contacto.java:12: error: cannot find symbol
        this._nombreContacto = nomnbreContacto;
                               ^
  symbol:   variable nomnbreContacto
  location: class Contacto
./Root/Main.java:21: error: cannot find symbol
        imprimirOpciones();
        ^
  symbol:   method imprimirOpciones()
  location: class Main
./Root/Main.java:22: error: cannot find symbol
        ControladorContactos agenda = new ControladorContactos();
        ^
  symbol:   class ControladorContactos
  location: class Main
./Root/Main.java:22: error: cannot find symbol
        ControladorContactos agenda = new ControladorContactos();
                                          ^
  symbol:   class ControladorContactos
  location: class Main
./Root/Main.java:83: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
./Root/Main.java:114: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
./Root/Main.java:131: error: cannot find symbol
                for (Item _Agenda : _Agenda)
                                    ^
  symbol:   variable _Agenda
  location: class Main
./Root/Main.java:131: error: cannot find symbol
                for (Item _Agenda : _Agenda)
                     ^
  symbol:   class Item
  location: class Main
./Root/Main.java:142: error: cannot find symbol
                volverMenu();
                ^
  symbol:   method volverMenu()
  location: class Main
18 errors



Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Kabuto: Hola. Muchos errores se deben a nombre de variables mal escritos, pero también a llamadas a métodos y clases que en realidad no has escrito, y claro,

Java no los encuentra.

¿Qué tal si comenzamos desde el principio?

He reescrito la clase Contacto haciendo algunos cambios.

- He cambiado el nombre de los atributos para que se ajuste más a las "convenciones" de Java. En este lenguaje no se estila hacer que nombres de

variables/atributos comiencen con una línea de subrayado.
Aunque por supuesto, eres libre de ponérsela. No afecta al funcionamiento del programa.
Pero no es costumbre hacerlo así.

- El atributo teléfono he preferido usar un String en lugar de un int.
Aunque sea un atributo compuesto de cifras numéricas, si no vamos a hacer operaciones matemáticas con él(sumas, restas, divisiones,...), por lo

general vamos a preferir tratar ese atributo como una cadena alfanumérica (String).
Aunque, de nuevo, eres libre de escoger el tipo de dato que quieras.

- Puesto que parece que quieres que los contactos se ordenen por "apellido", esto se puede facilitar haciendo que la clase implemente la interfaz

Comparable.
Al implementar esta interfaz, podemos sobreescribir (override) un método llamado compareTo() donde decidimos cómo se han de comparar los

objetos Contacto para decidir cual es el "mayor o menor", es decir, cuál va delante y cuál va detrás.
En este caso, el orden dependerá de comparar los apellidos, que como son datos String, esta clase ya sabe por sí misma como deben compararse.
Así que solo hay que retornar el resultado de comparar los apellidos.

- Además creo que quieres que el atributo "correo" funcione como una especia de clave única identificadora.
Es decir, no pueden haber dos contactos con un mismo correo, ya que va a ser un identificador único.
Esto también podemos facilitarlo si sobreescribimos el método equals().
Este método lo tienen TODAS las clases escritas en Java y sirve para decidir si dos objetos son iguales/equivalentes.
Pero aunque todas las clases lo incorporan, para que realmente funcione tenemos que sobreescribirlo y añadir el código necesario para decidir nosotros

cuándo se deben considerar "iguales" dos objetos de esta clase.

En este caso, vamos a querer que dos objetos se consideren "iguales/equivalentes" si ambos son de la clase Contacto y además tienen el mismo

valor para el atributo "correo".

Estos dos métodos, el compareTo() y el equals(), luego veremos que el ArrayList donde almacenaremos los objetos Contacto, sabrá

usarlos automáticamente para pedirle que ordene los contactos o para impedir que se almacenen dos contactos con el mismo correo.

- Por último, le vamos a sobreescribir también el método toString().
Este método se usa para construir una cadena donde se muestren todos los datos de los atributos, o al menos, los que consideremos más relevantes.
Esto facilita luego mostrar un listado de Contactos en pantalla, porque gracias a este método, cada objeto Contacto es capaz de

proporcionar una única cadena con los datos que queremos mostrar

El código podría quedar así:
Código: [Seleccionar]
public class Contacto implements Comparable<Contacto>{

private String nombre;
private String apellidos;
private String telefono; //Puesto que no haremos operaciones matemáticas, mejor String que int
private String correo;

public Contacto(String nombre, String apellidos, String telefono, String correo) {
this.nombre = nombre;
this.apellidos = apellidos;
this.telefono = telefono;
this.correo = correo;
}

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 getTelefono() {
return telefono;
}

public void setTelefono(String telefono) {
this.telefono = telefono;
}

public String getCorreo() {
return correo;
}

public void setCorreo(String correo) {
this.correo = correo;
}

@Override
public int compareTo(Contacto otroContacto) {
//Los contactos se comparan mediante los apellidos para ordenarse
return apellidos.compareTo(otroContacto.getApellidos());
}

@Override
public boolean equals(Object obj) {

if (obj instanceof Contacto) {
//El objeto recibido es un Contacto, hay que hacer "casting" para tratarlo como tal
Contacto otroContacto = (Contacto) obj;//Casting
//Dos contactos se consideran iguales, si coinciden su correo
return correo.equals(otroContacto.getCorreo());//Esto devuelve true o false, según si los correos coinciden o no
}
else
return false; //El objeto con el que se compara, no es un Contacto
}

@Override
public String toString() {
//Construimos una cadena con los datos del contacto
String cadena = "Nombre: " + nombre + " " + apellidos;
cadena += "\nTeléfono: " + telefono + "\tCorreo: " + correo;
//La retornamos
return cadena;
}

}

Revísalo y comenta si hay algo que no entiendes.

A ver si luego rasco algo más de tiempo y revisamos la clase Agenda. Un saludo.



Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Kabuto: Clase Agenda

Será un ArrayList de objetos Contacto

He 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 null
Este 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.
Código: [Seleccionar]
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 Main

Para 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
Citar
"^[_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 Pattern

Te 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.

Código: [Seleccionar]
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);
}

}



Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
LordFer: Buenos días Kabuto, antes de nada muchas gracias por ayudarme con el código la verdad, te explico los dos cambios que he tenido que realizar:
 
1. He tenido que quitar todas las tildes, ya que el compilador de java, da error al compilar.
2. Tuve cambiar por los .isBlank por is.Empty, me quedo así esa parte del código:

Código: [Seleccionar]
//Pedimos datos nuevos, si deja campos vacios, entonces no modificaremos esos datos
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
if (!nombre.isEmpty())
modificar.setNombre(nombre);
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
if (!apellidos.isEmpty())
modificar.setApellidos(apellidos);
System.out.print("Telefono: ");
String telefono = teclado.nextLine();
if (!telefono.isEmpty())
modificar.setTelefono(telefono);

/*

A continuación voy a intentar añadir que también se pueda buscar el contacto por su nombre o por su numero de teléfono. De nuevo muchísimas gracias por tu ayuda! ;D


Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Kabuto: Sí, las tildes por lo general es mejor no ponerlas porque pueden dar errores, o bien no darlos pero luego salir caracteres raros en pantalla según el ordenador donde se ejecute el código.
Mea culpa.

Usando isEmpty() será suficiente.
El método isBlank() es relativamente "nuevo", se añadió a la clase String en la versión 11 de Java. Si estás compilando con una versión anterior no te lo reconocerá.
Pero esto no es importante ahora mismo, de momento centra tus preocupaciones en entender y desarrollar la lógica del programa.

Por si tienes curiosidad, la diferencia entre esos métodos es que isEmpty() devuelve true si la cadena está completamente vacía, es decir, cero caracteres.

En cambio, isBlank() devuelve true si la cadena está completamente vacía o también si los caracteres que contiene son únicamente espacios en blanco.

Así que la diferencia entre tu programa y el mío, es que el tuyo aceptaría cadenas de espacios en blanco para modificar los nombres, apellidos y teléfonos.
El mío no los aceptaría, solo se podrían modificar tecleando algo, letras, símbolos o lo que sea, pero nada de espacios en blanco.

Pero insisto, son detalles sin importancia, no pierdas tiempos con esto.  ;)

Saludos.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
LordFer: Siento molestarte otra vez Kabuto, he conseguido hacer que puedas buscar el contacto por el nombre o por el correo, pero a la hora de poner el teléfono, quería poner una expresion regular para que el número de teléfono tenga que tener si o si 9 digitos, pero no consigo que funcione, he probado este.
 
              \\+[0-9]

Pero no funciona, ¿Sabes a qué se debe esto?

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Kabuto: Las expresiones regulares son un dolor de cabeza...  :o, pero las muy malditas son muy útiles y potentes.

Prueba con esta expresión, yo la he probado y parece funcionar bien:
Código: [Seleccionar]
[\\d]{9}
\d es un carácter especial que significa cualquier digito, es lo mismo que poner el rango 0-9

Pero en Java y otros lenguajes, hay que usar doble barra invertida \\d
La primera barra lo que hace es "escapar" a la segunda, es decir, para indicar que esa segunda barra, forma parte de un carácter especial, el carácter \d
Si no la "escapamos", el compilador piensa que es una barra invertida y una letra d (dos caracteres individuales). Pero nosotros lo que queremos es indicar un único carácter "especial" (que se compone de dos símbolos, pero es un único carácter en verdad)

El {9} indica la cantidad de caracteres que ha de tener la cadena para coincidir con la expresión. Ahí le decimos que queremos 9, ni más ni menos.


 

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".