Avec utilisation de Scanner et TreeSet
Créez une application de gestion de contacts en utilisant un TreeSet pour stocker les informations de vos contacts :
Utilisez l’héritage pour créer des classes :
Ces classe doivent hériter de la classe Contact.
Utilisez la console en affichant le menu ci-dessous et en créant les fonctionnalistés correspondantes :
======= M E N U ====== 1. Ajouter un contact professionnel 2. Ajouter un contact personnel 3. Rechercher un contact par nom 4. Afficher tous les contacts 5. Quitter l'application Choisissez une option :
Classe abstraite Contact :
package fr.bouget.gestion.contact; /** * Classe abstraite (non instanciable) * @author philBouget * */ public abstract class Contact { protected String prenom; protected String nom; protected String telephone; protected String email; public Contact(String prenom, String nom, String telephone, String email) { this.prenom = prenom; this.nom = nom; this.telephone = telephone; this.email = email; } public Contact() { this(null,null,null,null); } public String getPrenom() { return prenom; } public String getNom() { return nom; } public String getTelephone() { return telephone; } public String getEmail() { return email; } /* * Méthode abstraite à définir dans les sous-classes */ public abstract String getType(); @Override public String toString() { return "Contact : "+ prenom + " "+ nom + " " + telephone + " " + email + " (type : " + getType() + ")"; } }
Classe Personnel :
package fr.bouget.gestion.contact; public class Personnel extends Contact { public Personnel(String prenom, String nom, String telephone, String email) { super(prenom, nom, telephone, email); } public Personnel() { this(null, null, null, null); } @Override public String getType() { return "Personnel"; } }
Classe Professionnel :
package fr.bouget.gestion.contact; public class Professionnel extends Contact{ private String societe; public Professionnel() { this(null, null,null,null, null); } public Professionnel(String prenom, String nom, String telephone, String email, String societe) { super(prenom, nom, telephone, email); this.societe = societe; } public String getSociete() { return societe; } @Override public String getType() { return "Professionnel"; } @Override public String toString() { return super.toString() + " " + societe+" (société)."; } }
Classe de Lancement pour effectuer les tests :
package fr.bouget.gestion; import java.util.Scanner; import java.util.TreeSet; import fr.bouget.gestion.contact.Contact; import fr.bouget.gestion.contact.Personnel; import fr.bouget.gestion.contact.Professionnel; /* * Dans ce TP on a pas encore gérer les exceptions liées au erreurs de saisie * On verra cela ultérieurement. * Vous pouvez aussi trouver des solutions pour simplifier la partie saisie qui est * redondante dans les différentes méthodes. */ public class Lancement { /* Collection de type Tree pour définir des tris alphabétiques ici TreeSet est une implémentation de l'interface Set qui stocke des éléments de manière triée. Il utilise un comparateur pour définir l'ordre de tri des éléments,ici alphabétique sur les noms. J'utilise une fonction Lambda dont nous verrons la syntaxe ultérieurement. La méthode compareTo() est une méthode de classe String qui compare 2 chaînes de caractères, si vous lisez la documentation java, vous verrez qu'elle retourne : - un entier négatif - un zéro - un entier positif si la chaîne courante est "lexicographiquement" inférieure, égale ou supérieure à la chaîne passée en argument. */ static TreeSet<Contact> contacts = new TreeSet<>((c1, c2) -> c1.getNom().compareTo(c2.getNom())); static Scanner sc = new Scanner(System.in); public static void main(String[] args) { // on met des contacts par défaut Professionnel joachim = new Professionnel("Joachim","Boubou","0752658452", "jojo@trompette.com", "Staps"); Professionnel mathieu = new Professionnel("Mathieu","Lanlan","0689652314","math@trombone.com", "ens"); Personnel agnes = new Personnel("philippe","Boubou","0752658454", "phil@numerosoft.fr"); Personnel philippe = new Personnel("Agnès","Lanlan","0752651254", "agnes@numerosoft.fr"); contacts.add(joachim); contacts.add(mathieu); contacts.add(agnes); contacts.add(philippe); boolean continuer = true; while (continuer) { // affichage du menu dans la console System.out.println("======= M E N U ======\n"); System.out.println("1. Ajouter un contact professionnel"); System.out.println("2. Ajouter un contact personnel"); System.out.println("3. Rechercher un contact par nom"); System.out.println("4. Afficher tous les contacts"); System.out.println("5. Quitter l'application\n\n"); System.out.println("Choisissez une option : \n"); int choix = sc.nextInt(); sc.nextLine(); switch (choix) { case 1: ajouterContactPro(); break; case 2: ajouterContactPerso(); break; case 3: rechercherContact(); break; case 4: afficherContacts(); break; case 5: System.out.println("Salut ! A bientôt... ;("); continuer = false; break; default: System.out.println("Choix invalide."); break; } } } // méthode pour ajouter un contact professionnel ou personnel public static void ajouterContactPro() { // ici on pourrait simplifer en factorisant ce code // redondant dans d'autres méthodes System.out.println("Nom : "); String nom = sc.nextLine(); System.out.println("Prénom : "); String prenom = sc.nextLine(); System.out.println("Téléphone : "); String telephone = sc.nextLine(); System.out.println("Adresse mail : "); String mail = sc.nextLine(); System.out.println("Société : "); String societe = sc.nextLine(); Professionnel contact = new Professionnel(nom, prenom, telephone, mail, societe); // on l'ajoute à notre liste contacts.add(contact); System.out.println("Contact Professionnel ajouté !"); } // méthode pour ajouter un contact perso public static void ajouterContactPerso() { System.out.println("Nom : "); String nom = sc.nextLine(); System.out.println("Prénom : "); String prenom = sc.nextLine(); System.out.println("Téléphone : "); String telephone = sc.nextLine(); System.out.println("Adresse mail : "); String mail = sc.nextLine(); Personnel contact = new Personnel(nom, prenom, telephone, mail); contacts.add(contact); System.out.println("Contact Personnel ajouté !"); } // Afficher tous les contacts public static void afficherContacts() { for (Contact contact : contacts) { System.out.println(contact); } } // méthode pour rechercher un contact public static void rechercherContact() { System.out.print("Entrez le nom ou le prénom du contact à rechercher : "); String motCle = sc.nextLine(); boolean contactTrouve = false; // par défaut // on parcours notre TreeSet for (Contact contact : contacts) { if (contact.getNom().toUpperCase().contains(motCle.toUpperCase()) || contact.getPrenom().toUpperCase().contains(motCle.toUpperCase())) { System.out.println(contact); contactTrouve = true; } } if (!contactTrouve) { System.out.println("Désolé, aucun contact trouvé pour "+motCle+ " !"); } } }
Vous ajouterez des méthodes abstraites pour obtenir le petitNom, le poids, la nourriturePreferee et le son émit par l’animal.
Ajoutez des méthodes pour initialiser le petitNom, le poids et le son que peut émettre chaque animal, par exemple, vous pouvez écrire une méthode miauler() pour les chats, aboyer() pour les chiens et chanter() pour les oiseaux,…. Ces méthodes peuvent éventuellement êtres privées et appelées par une méthode commune communiquer()
Créez un tableau d’animaux ou une collection qui contient des objets de différents types d’animaux (chats, chiens, oiseaux, canard et autres si vous avez des idées).
Dans votre méthode main() vous pouvez utiliser une boucle foreach pour parcourir le tableau des animaux et utiliser appeler la méthode() communiquer() pour que chaque animal s’exprime. Ceci implique l’utilisation du polymorphisme.
Pour le fun, vous pouvez ajouter des méthodes rigolotes pour chaque animal et utiliser le mot clé instanceof. (partie non réalisée dans la correction)
Ajouter une classe LaFerme avec un nom, une collection de type HashSet<> pour enregistrer les animaux, des méthodes pour ajouter et suprimer un animal et afficher tous les animaux de la ferme
J’ai ajouté 2 exception personnalisation pour afficher un message si l’animal est déjà dans la Ferme et on tente de l’ajouter et aussi si on essaye de supprimer un animal qui n’est pas de la Ferme, à vous de trouver d’autres idées. ça permet d’illustrer l’utilisation des Exceptions.
Classe Animal :
package fr.numerosoft.animaux; public abstract class Animal { protected String petitNom; protected double poids; protected String nourriturePreferee; public Animal(String petitNom, double poids, String nourriturePreferee) { super(); this.petitNom = petitNom; this.poids = poids; this.nourriturePreferee = nourriturePreferee; } public abstract String getPetitNom(); public abstract double getPoids(); public abstract String getNourriturePreferee(); public abstract void communiquer(); @Override public String toString() { return petitNom + " qui pèse " + poids + "kg et mange " + nourriturePreferee; }
classe Chat :
package fr.numerosoft.animaux; public class Chat extends Animal { public Chat(String petitNom, double poids, String nourriturePreferee) { super(petitNom, poids, nourriturePreferee); } @Override public String getPetitNom() { return null; } @Override public double getPoids() { return 0; } @Override public String getNourriturePreferee() { return null; } @Override public void communiquer() { System.out.println(miauler()); } private String miauler() { return "Miaou miaou"; } @Override public String toString() { return super.toString()+" et fait "+this.miauler(); } }
Classe Chien :
package fr.numerosoft.animaux; public class Chien extends Animal { public Chien(String petitNom, double poids, String nourriturePreferee) { super(petitNom, poids, nourriturePreferee); } @Override public String getPetitNom() { return null; } @Override public double getPoids() { return 0; } @Override public String getNourriturePreferee() { return null; } @Override public void communiquer() { System.out.println(aboyer()); } private String aboyer() { return "Waouf waouf"; } @Override public String toString() { return super.toString()+" et fait "+this.aboyer(); } }
Classe Oiseau :
package fr.numerosoft.animaux; public class Oiseau extends Animal { public Oiseau(String petitNom, double poids, String nourriturePreferee) { super(petitNom, poids, nourriturePreferee); } @Override public String getPetitNom() { return null; } @Override public double getPoids() { return 0; } @Override public String getNourriturePreferee() { return null; } @Override public void communiquer() { System.out.println(chanter()); } private String chanter() { return "titititlalalala"; } @Override public String toString() { return super.toString()+" et fait "+this.chanter(); } }
Classe Canard :
package fr.numerosoft.animaux; public class Canard extends Animal { public Canard(String petitNom, double poids, String nourriturePreferee) { super(petitNom, poids, nourriturePreferee); } @Override public String getPetitNom() { return null; } @Override public double getPoids() { return 0; } @Override public String getNourriturePreferee() { return null; } @Override public void communiquer() { System.out.println(cancaner()); } private String cancaner() { return "Coin coin"; } @Override public String toString() { return super.toString()+" et fait "+this.cancaner(); } }
Classe LaFerme :
package fr.numerosoft.animaux; import java.util.HashSet; import java.util.Set; import javax.swing.JOptionPane; import fr.numerosoft.animaux.exceptions.AnimalDejaChezNousException; import fr.numerosoft.animaux.exceptions.AnimalPasChezNousException; public class LaFerme { private String nomDeLaFerme; private Set<Animal> animaux; public LaFerme(String nomDeLaFerme) { this.nomDeLaFerme= nomDeLaFerme; this.animaux = new HashSet<>(); } /** * Cette méthode traite une Exception spécifique * Un message sera affiché si l'animal est déjà dans la Ferme ! * @param animal * @return * @throws AnimalDejaChezNousException */ public String ajouterAnimal(Animal animal) throws AnimalDejaChezNousException { try { // si l'animal n'est pas chez nous on l'ajoute if (!this.animaux.contains(animal)) { animaux.add(animal); // et on l'annonce ! return animal + " est arrivé à la Ferme !"; } else { // sinon on prévient que l'animal est déjà chez nous ! // on lance nous-même une exception qui sera attrapée dans le catch throw new AnimalDejaChezNousException(animal + " est déjà chez nous !"); } } catch(AnimalDejaChezNousException e) { // ici on affiche l'exception que nous avons lancé plus haut JOptionPane.showMessageDialog(null, e.getMessage()); return ""; } } public String supprimerAnimal(Animal animal) throws AnimalPasChezNousException { try { if (this.animaux.contains(animal)) { this.animaux.remove(animal); return animal + " nous a quitté :( "; } else { throw new AnimalPasChezNousException(animal + " pas de chez nous !"); } } catch(AnimalPasChezNousException e) { JOptionPane.showMessageDialog(null, e.getMessage()); return ""; } } public void afficherAnimaux() { for (Animal animal : animaux) { System.out.println(animal); } } public Set<Animal> getAnimaux() { return animaux; } public String getNomDeLaFerme() { return nomDeLaFerme; } public void setNomDeLaFerme(String nomDeLaFerme) { this.nomDeLaFerme = nomDeLaFerme; } }
Classes AnimalDejaChezNousException et AnimalPasChezNousException :
package fr.numerosoft.animaux.exceptions; public class AnimalDejaChezNousException extends Exception { public AnimalDejaChezNousException(String message) { super(message); } public AnimalDejaChezNousException() { this("Cet animal est déjà chez nous !"); } }
package fr.numerosoft.animaux.exceptions; public class AnimalPasChezNousException extends Exception { public AnimalPasChezNousException() { this("Cet animal n'est pas de chez nous !"); } public AnimalPasChezNousException(String message) { super(message); } }
Classe Lancement :
package fr.numerosoft.animaux; import fr.numerosoft.animaux.exceptions.AnimalDejaChezNousException; import fr.numerosoft.animaux.exceptions.AnimalPasChezNousException; public class Lancement { public static void main(String[] args) throws AnimalDejaChezNousException, AnimalPasChezNousException { LaFerme duduche = new LaFerme("Chez Duduche"); // les animaux Chat youki = new Chat("Youki",3.2, "les croquettes qui puent"); Chat monsieurPropre = new Chat("MonsieurPropre",2.5, "le lait de brebis"); Chien diane = new Chien("Diane",5.2, "le gruyère"); Canard donald = new Canard("Donald", 4, "le pain tout mou"); Oiseau merlin = new Oiseau("Merlin",0.5, "les graines du hamster"); // on créer Pilou pour tester le fait d'enlever un animal qui n'est pas dans la ferme // pour constater l'affichage d'un animal qui n'existe pas dans la ferme. Chien pilou = new Chien("Pilou", 15, "les canards, les poules, les chats"); // il en manque beaucoup... je vous laisse créer les classes // on ajoute nos animaux System.out.println(duduche.ajouterAnimal(youki)); System.out.println(duduche.ajouterAnimal(monsieurPropre)); System.out.println(duduche.ajouterAnimal(diane)); System.out.println(duduche.ajouterAnimal(donald)); System.out.println(duduche.ajouterAnimal(merlin)); System.out.println(duduche.ajouterAnimal(merlin)); // il ne sera pas ajouté ! System.out.println(duduche.supprimerAnimal(pilou)); duduche.afficherAnimaux(); // la communication chez les animaux for (Animal animal : duduche.getAnimaux()) { animal.communiquer(); } // trouver le moyen d'utiliser instanceof sur un des animaux en // lui ajoutant une méthode spécifique que les autres non pas... } }