Rubrica.java
Created with JBuilder
class Rubrica {
  // Attributi
  private Persona[] elencoPersone;
  private int       numeroPersone;

  // Costruttore
  public Rubrica( int numeroMaxPersone ) {
    elencoPersone = new Persona[numeroMaxPersone];
    numeroPersone = 0;
  }

  // Aggiungi una persona
  public void aggiungi( Persona p ) {
    // Se l'elenco è pieno allora è necessario espanderlo
    if (numeroPersone == elencoPersone.length) {
      espandiElenco(2);
    }
    elencoPersone[numeroPersone] = p;
    ++numeroPersone;
  }

  // Cerca una persone per nome
  public Persona cercaPersonaPerNome( String nomeCercato ) {
    for (int i = 0; i < numeroPersone; i++) {
      String nomeTrovato = elencoPersone[i].restituisciNome();
      if (nomeTrovato.equals(nomeCercato)) {
        return elencoPersone[i];
      }
    }
    return null;
  }

  // Cerca tutte le persone che abitano ad un dato indirizzo
  public Persona[] cercaPersonePerIndirizzo( String indirizzoCercato ) {
    Persona[] personeCercate = new Persona[numeroPersone];
    int elementiCercati = 0;
    for (int i = 0; i < numeroPersone; i++) {
      String indirizzoTrovato =
                 elencoPersone[i].restituisciIndirizzo();
      if (indirizzoTrovato.equals(indirizzoCercato)) {
        personeCercate[elementiCercati] = elencoPersone[i];
        ++elementiCercati;
        // elementiCercati++;
        // elementiCercati += 1;
        // elementiCercati = elementiCercati + 1;
      }
    }
    return personeCercate;
  }

  // Cancellare una persona (dato il nome)
  public Persona cancellaPersonaPerNome( String nomeCercato ) {
    Persona risultato = null;
    for (int i = 0; i < numeroPersone; i++) {
      String nomeTrovato = elencoPersone[i].restituisciNome();
      if (nomeTrovato.equals(nomeCercato)) {
        risultato = elencoPersone[i];
        elencoPersone[i] = elencoPersone[numeroPersone - 1];
        elencoPersone[numeroPersone - 1] = null;
        --numeroPersone;
        break;
      }
    }
    return risultato;
  }

  // Altra versione del metodo di cancellazione (più elegante)
  public Persona cancellaPersonaPerNome2( String nomeCercato ) {
    Persona risultato = null;
    int i = 0;
    while ((i < numeroPersone) && (risultato == null)) {
      String nomeTrovato = elencoPersone[i].restituisciNome();
      if (nomeTrovato.equals(nomeCercato)) {
        risultato = elencoPersone[i];
        elencoPersone[i] = elencoPersone[numeroPersone - 1];
        elencoPersone[numeroPersone - 1] = null;
        --numeroPersone;
      }
    }
    return risultato;
  }

  // Metodo per espandere l'elenco di un fattore dato
  private void espandiElenco(int fattore) {
    int nuovaDimensione = elencoPersone.length * fattore;
    Persona[] elencoEspanso = new Persona[nuovaDimensione];
    for (int i = 0; i < elencoPersone.length; i++) {
      elencoEspanso[i] = elencoPersone[i];
    }
    elencoPersone = elencoEspanso;
  }

}

Rubrica.java
Created with JBuilder