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:

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;
    }
}

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.