Exercice Java : Gestion d’un répertoire

Exercice java traite le  sujet suivant:

Classe Repertoire en java permettant de gérer un répertoire téléphonique associant un numéro de téléphone à un nom.

Examinons ce petit Exercice java:



Réaliser une classe Repertoire permettant de gérer un répertoire téléphonique associant un numéro de téléphone (chaîne de caractères) à un nom. Pour faciliter les choses, on prévoira une classe Abonne destinée à représenter un abonné et  disposant des fonctionnalités indispensables.

La classe Repertoire devra disposer des fonctionnalités suivantes :

  • constructeur recevant un argument de type entier précisant le nombre maximum d’abonnés que pourra contenir le répertoire (cette particularité évite d’avoir à se soucier d’une gestion dynamique du répertoire),
  • méthode addAbonne permettant d’ajouter un nouvel abonné ; elle renverra la valeur false si le répertoire est plein, la valeur true sinon,
  • méthode getNumero fournissant le numéro associé à un nom d’abonné fourni en argument,
  • méthode getNAbonnes qui fournit le nombre d’abonnés figurant dans le répertoire,
  • méthode getAbonne fournissant l’abonné dont le rang est fourni en argument,
  • méthode getAbonnesTries fournissant un tableau des références des différents abonnés, rangés par ordre alphabétique (pour simplifier, on supposera que les noms sont écrits en minuscules, sans caractères accentués).

Écrire un petit programme de test.

La classe Abonne ne présente pas de difficultés particulières. Si, comme il est conseillé, on y encapsule les champs de données, il faut simplement prévoir les méthodes d’accès correspondantes :

class Abonne
{ public Abonne (String nom, String numero)
  { this.nom = nom ; this.numero = numero ;
  }
  public String getNom()    { return nom ; }
  public String getNumero() { return numero ; }
  private String nom, numero ;
}

En ce qui concerne la classe Repertoire, nous pouvons nous permettre, dans la méthode getAbonne, de fournir en  résultat une copie de la référence à l’abonné correspondant. En effet, ici l’objet correspondant n’est pas modifiable  (champs privés, pas de méthodes d’altération).
Dans la méthode getAbonnesTries, nous faisons porter le tri sur une copie du tableau des références aux différents abonnés, afin de ne pas modifier l’ordre initial du répertoire.
Voici ce que pourrait être la définition de notre classe Repert :

class Repert
{ public Repert (int nMax)
  { this.nMax = nMax ;
    rep = new Abonne [nMax] ;
    nAbon = 0 ;
  }
public boolean addAbonne (Abonne a)
  { if (nAbon >= nMax) return false ;
    rep[nAbon] = a ;
    nAbon++ ;
    return true ;
  }
  public int getNAbonnes () { return nAbon ; }
  public Abonne getAbonne (int num)
  { if (num < nAbon) return rep[num] ;
    return null ;
  }
  public String getNumero (String nom)
  { for (int i=0 ; i<=nAbon ; i++)
      if (nom.equals(rep[i].getNom())) return rep[i].getNumero() ;
      // ou (depuis JDK 5.0) :
      // for (Abonne a : rep)
      //    if (nom.equals(a.getNom())) return a.getNumero() ;
      return null ;
  }
  public Abonne[] getAbonnesTries ()
  { Abonne[] repTrie = new Abonne[nAbon] ;
    for (int i=0 ; i<nAbon ; i++)
      repTrie[i] = rep[i] ;
    for (int i=0 ; i<nAbon-1 ; i++)
      for (int j=i+1 ; j<nAbon ; j++)
        if ((repTrie[i].getNom()).compareTo(repTrie[j].getNom()) >0)
          { Abonne temp = repTrie[i] ;
            repTrie[i] = repTrie[j] ;
            repTrie[j] = temp ;
          }
     return repTrie ;
  }
  private int nMax, nAbon ;
  private Abonne[] rep ;
}

Voici un petit programme de test, accompagné de ses résultats :

public class TstRep
{ public static void main (String args[])
  { Repert rep = new Repert(10) ;
    System.out.println ("il y a " + rep.getNAbonnes () + " abonnes");
    Abonne a = new Abonne("Dupont", "02-38-25-88-99") ;
    Abonne b = new Abonne("Duval",  "04-55-66-77-99") ;
    rep.addAbonne (a) ;
    rep.addAbonne (b) ;
    rep.addAbonne (new Abonne ("Duchene", "02-11-22-33-44")) ;
    rep.addAbonne (new Abonne ("Dubois", "01-11-22-33-44")) ;
    System.out.println ("il y a " + rep.getNAbonnes () + " abonnes");
    System.out.println ("qui sont : ") ;
    for (int i=0 ; i<rep.getNAbonnes() ; i++)
      System.out.println (rep.getAbonne(i).getNom() + " "
                         + rep.getAbonne(i).getNumero()) ;
    System.out.println ("ou encore, par ordre alphabetique") ;
    Abonne[] abonnes = rep.getAbonnesTries () ;
    for (int i=0 ; i<abonnes.length ; i++)
     System.out.println (abonnes[i].getNom() + " " + abonnes[i].getNumero());
  }
}
il y a 0 abonnes
il y a 4 abonnes
qui sont :
Dupont 02-38-25-88-99
Duval 04-55-66-77-99
Duchene 02-11-22-33-44
Dubois 01-11-22-33-44
ou encore, par ordre alphabetique
Dubois 01-11-22-33-44
Duchene 02-11-22-33-44
Dupont 02-38-25-88-99
Duval 04-55-66-77-99

1. Dans la méthode getAbonnesTries, nous avons pu nous contenter de recopier seulement les références des chaînes et non les chaînes elles-mêmes. En effet, l’utilisateur de cette méthode pourra toujours modifier les valeurs du tableau de références dont il reçoit la référence en retour mais il ne pourra pas modifier les chaînes ainsi référencées.
2. Dans un programme réel, les objets de type Abonne pourraient comporter d’autres informations (adresse…). Il  pourrait également être judicieux de vérifier lors de la construction d’un tel objet que la chaîne correspondant au  numéro répond à certains critères.

Leave a Reply

Your email address will not be published. Required fields are marked *


*