Proyecto: una agenda de contactos en Java
Un proyecto guiado paso a paso para juntar todo lo básico: clases, ArrayList, un bucle de menú y métodos. Con una consola interactiva para probarlo.
Qué vas a construir
Un programa de consola que guarda contactos (nombre y teléfono) en memoria mientras se ejecuta. Podrás añadir, listar, buscar y borrar. Es el proyecto perfecto para afianzar clases, listas y bucles.
Pruébalo aquí mismo antes de ver el código. Escribe un comando y pulsa Enter:
ayudalistanuevo <nombre> <telefono>buscar <texto>borra <n>
Paso 1: la clase Contacto
Cada contacto tiene un nombre y un teléfono. Eso es una clase con dos campos, un constructor y un método para mostrarlo.
public class Contacto {
String nombre;
String telefono;
Contacto(String nombre, String telefono) {
this.nombre = nombre;
this.telefono = telefono;
}
@Override
public String toString() {
return nombre + " — " + telefono;
}
}
toString() hace que al imprimir el contacto salga un texto legible en vez de algo como Contacto@1b6d3586.Paso 2: guardar los contactos en un ArrayList
No sabemos cuántos contactos habrá, así que usamos un ArrayList: una lista que crece sola.
import java.util.ArrayList;
import java.util.Scanner;
public class Agenda {
static ArrayList<Contacto> contactos = new ArrayList<>();
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
contactos.add(new Contacto("Ana Gómez", "600111222"));
contactos.add(new Contacto("Luis Pérez", "655333444"));
// ... el menú va aquí (paso 3)
}
}
Paso 3: el menú con un bucle while
El programa repite: enseña opciones, lee lo que escribe el usuario y actúa. Sale cuando se escribe salir.
while (true) {
System.out.print("\n> ");
String linea = sc.nextLine().trim();
String[] partes = linea.split("\\s+");
String cmd = partes[0].toLowerCase();
if (cmd.equals("salir")) {
System.out.println("Hasta luego.");
break;
} else if (cmd.equals("lista")) {
listar();
} else if (cmd.equals("nuevo")) {
// nuevo Marta Ruiz 611222333
String telefono = partes[partes.length - 1];
String nombre = linea.substring(6, linea.length() - telefono.length()).trim();
contactos.add(new Contacto(nombre, telefono));
System.out.println("Contacto añadido: " + nombre);
} else if (cmd.equals("buscar")) {
buscar(linea.substring(7).toLowerCase());
} else if (cmd.equals("borra")) {
borrar(Integer.parseInt(partes[1]) - 1);
} else {
System.out.println("Comando no reconocido.");
}
}
Paso 4: los métodos
Cada acción en su propio método: el main queda corto y legible.
static void listar() {
if (contactos.isEmpty()) {
System.out.println("(agenda vacía)");
return;
}
for (int i = 0; i < contactos.size(); i++) {
System.out.println(" " + (i + 1) + ". " + contactos.get(i));
}
}
static void buscar(String texto) {
for (Contacto c : contactos) {
if (c.nombre.toLowerCase().contains(texto)) {
System.out.println(" " + c);
}
}
}
static void borrar(int indice) {
if (indice >= 0 && indice < contactos.size()) {
Contacto fuera = contactos.remove(indice);
System.out.println("Borrado: " + fuera.nombre);
} else {
System.out.println("Número fuera de rango.");
}
}
Cómo seguir
- Guardar la agenda en un fichero para no perderla al cerrar (ver Ficheros en Java).
- Validar el teléfono con una expresión regular (ver Regex en Java).
- Usar un
Map<String, Contacto>para buscar por nombre al instante (ver Colecciones). - Ordenar los contactos alfabéticamente con
Collections.sort.