/* Fichier ListePers.java * expliqué mercredi soir le 17 avril */ import java.util.*; import java.io.*; class Personne implements Comparable { private String nomPre; private char sexe; private double taille, poids; private int numero; public Personne(String nomPre, char sexe, double taille, double poids, int numero) { this.nomPre = nomPre; this.sexe = sexe; this.taille = taille; this.poids = poids; this.numero = numero; } public String toString() { return String.format("%-30s %6.2f %8.1f %7d %s\n", nomPre, taille, poids, numero, (sexe == 'F' ? "féminin":"masculin")); } public int compareTo(Personne autre) { return nomPre.toUpperCase().trim().compareTo(autre.nomPre.toUpperCase().trim()); } public boolean equals(Object obj) { if (this == obj) return true; else if (!(obj instanceof Personne)) return false; else { Personne autre = (Personne) obj; return nomPre.trim().equalsIgnoreCase(autre.nomPre.trim()); } } } public class ListePers { // lire un fichier, remplir et retourner une liste des personnes static LinkedList lireCreer(String nomFichier) throws IOException { LinkedList liste = new LinkedList(); // liste vide au début boolean existeFichier = true ; // à ajuster après FileReader fr = null; // initialiser pour Java // essayer de LOCALISER le fichier à partir de son nom try { fr = new FileReader (nomFichier) ; } // intercepter l'erreur si le fichier n'existe pas catch ( java.io.FileNotFoundException erreur) { System.out.println("Probleme d'ouvrir le fichier " + nomFichier); existeFichier = false ; // ajuster } if (existeFichier) { // construire l'objet d'entrée qui va permettre // d'appliquer la lecture d'une ligne de texte BufferedReader entree = new BufferedReader(fr); boolean finFichier = false ; while ( !finFichier ) { // lire une ligne String uneLigne = entree.readLine(); if (uneLigne == null) finFichier = true ; else { /* 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 MICHAUD NORMAND M 1.73 103.7 3428 */ String nomPre = uneLigne.substring(0, 30); char sexe = uneLigne.charAt(30); double taille = Double.parseDouble(uneLigne.substring(37, 41)); double poids = Double.parseDouble(uneLigne.substring(51, 56).trim()); int numero = Integer.parseInt(uneLigne.substring(64).trim()); liste.add(new Personne(nomPre, sexe, taille, poids, numero)); } } entree.close(); } return liste; } static void afficher(LinkedList liste, int debut, int fin, String mess) { System.out.printf("Contenu de la liste %s :\n", mess); for(int i = 0; i < liste.size(); i++) { if ( i < debut || i >= liste.size()-fin) System.out.printf("%3d) %s", i, liste.get(i)); else if ( i == debut) System.out.printf("%3d) etc . . .\n", i); } System.out.printf("\n"); } static void demoRechercheSequentielle(LinkedList liste) { String[] nomPre = { "Dube Francoise", "Tremblay Marc", "Olivier Jean", "Robitaille suzanne" }; for(int i = 0; i < nomPre.length; i++) { System.out.printf("\nOn fait la recherche de %s :\n", nomPre[i]); Personne aChercher = new Personne(nomPre[i], ' ', 0.0, 0.0, 0); boolean trouve = liste.contains(aChercher); if (trouve) { int k = liste.indexOf(aChercher), z = liste.lastIndexOf(aChercher); if (k == z) System.out.printf("L'unique personne trouvée :\n%3d) %s\n", k, liste.get(k)); else { for(int j = k; j <= z; j++) if (liste.get(j).equals(aChercher)) System.out.printf("On trouve : %3d) %s", j, liste.get(j)); } } else System.out.printf("\nOn ne la trouve pas\n"); } } static void demoRechercheDichotomique(LinkedList liste) { String[] nomPre = { "Dube Francoise", "Tremblay Marc", "Olivier Jean", "Robitaille suzanne" }; for(int i = 0; i < nomPre.length; i++) { System.out.printf("\nOn fait la recherche de %s :\n", nomPre[i]); Personne aChercher = new Personne(nomPre[i], ' ', 0.0, 0.0, 0); int k = Collections.binarySearch(liste, aChercher); if (k >= 0) { int debut = liste.indexOf(aChercher), fin = liste.lastIndexOf(aChercher); for(int j = debut; j <= fin; j++) System.out.printf("On trouve : %3d) %s", j, liste.get(j)); } else System.out.printf("\nOn ne la trouve pas et k vaut : %d\n", k); } } public static void main(String[] args) throws IOException { LinkedList liste = lireCreer("e:\\IFT1170\\Personne.txt"); System.out.printf("On vient de créer une liste de %d personnes\n", liste.size()); afficher(liste,10, 5, "partielle après la lecture"); demoRechercheSequentielle(liste); Collections.sort(liste); afficher(liste,12, 6, "partielle après le tri selon les noms prénoms"); demoRechercheDichotomique(liste); } } /* Exécution : --------------------Configuration: -------------------- On vient de créer une liste de 24 personnes Contenu de la liste partielle après la lecture : 0) ROY CHANTAL 1,63 54,9 2754 féminin 1) MOLAISON CLAUDE 1,57 62,2 1848 masculin 2) ROBITAILLE SUZANNE 1,79 72,3 2007 féminin 3) BEDARD MARC-ANDRE 1,43 80,5 2636 masculin 4) MONAST STEPHANE 1,65 61,7 1750 masculin 5) JALBERT LYNE 1,63 52,6 2168 féminin 6) DUBE FRANCOISE 1,68 67,5 4612 féminin 7) ROBITAILLE SUZANNE 1,72 65,4 2325 féminin 8) LEMELIN SOPHIE 1,68 57,8 7777 féminin 9) LABELLE LISE 1,79 68,0 1512 féminin 10) etc . . . 19) FILLION ERIC 1,78 75,7 2630 masculin 20) DESMARAIS DENISE 1,75 58,7 3215 féminin 21) TREMBLAY MARC 1,79 64,9 3529 masculin 22) TREMBLAY SYLVAIN 1,83 86,2 1538 masculin 23) ROBITAILLE SUZANNE 1,58 60,2 4119 féminin On fait la recherche de Dube Francoise : L'unique personne trouvée : 6) DUBE FRANCOISE 1,68 67,5 4612 féminin On fait la recherche de Tremblay Marc : L'unique personne trouvée : 21) TREMBLAY MARC 1,79 64,9 3529 masculin On fait la recherche de Olivier Jean : On ne la trouve pas On fait la recherche de Robitaille suzanne : On trouve : 2) ROBITAILLE SUZANNE 1,79 72,3 2007 féminin On trouve : 7) ROBITAILLE SUZANNE 1,72 65,4 2325 féminin On trouve : 15) ROBITAILLE SUZANNE 1,48 61,5 4371 féminin On trouve : 23) ROBITAILLE SUZANNE 1,58 60,2 4119 féminin Contenu de la liste partielle après le tri selon les noms prénoms : 0) BEDARD MARC-ANDRE 1,43 80,5 2636 masculin 1) BEGIN MARIE-LUCE 1,62 49,0 4101 féminin 2) BERGEVIN GUILLAUME 1,84 86,4 2277 masculin 3) COUTU PIERRE 1,72 62,1 4008 masculin 4) DESMARAIS DENISE 1,75 58,7 3215 féminin 5) DUBE FRANCOISE 1,68 67,5 4612 féminin 6) DUMITRU PIERRE 1,92 99,4 3629 masculin 7) FILLION ERIC 1,78 75,7 2630 masculin 8) JALBERT LYNE 1,63 52,6 2168 féminin 9) LABELLE LISE 1,79 68,0 1512 féminin 10) LEMELIN SOPHIE 1,68 57,8 7777 féminin 11) MICHAUD NORMAND 1,73 103,7 3428 masculin 12) etc . . . 18) ROBITAILLE SUZANNE 1,72 65,4 2325 féminin 19) ROBITAILLE SUZANNE 1,48 61,5 4371 féminin 20) ROBITAILLE SUZANNE 1,58 60,2 4119 féminin 21) ROY CHANTAL 1,63 54,9 2754 féminin 22) TREMBLAY MARC 1,79 64,9 3529 masculin 23) TREMBLAY SYLVAIN 1,83 86,2 1538 masculin On fait la recherche de Dube Francoise : On trouve : 5) DUBE FRANCOISE 1,68 67,5 4612 féminin On fait la recherche de Tremblay Marc : On trouve : 22) TREMBLAY MARC 1,79 64,9 3529 masculin On fait la recherche de Olivier Jean : On ne la trouve pas et k vaut : -15 On fait la recherche de Robitaille suzanne : On trouve : 17) ROBITAILLE SUZANNE 1,79 72,3 2007 féminin On trouve : 18) ROBITAILLE SUZANNE 1,72 65,4 2325 féminin On trouve : 19) ROBITAILLE SUZANNE 1,48 61,5 4371 féminin On trouve : 20) ROBITAILLE SUZANNE 1,58 60,2 4119 féminin Process completed. */