import java.util.*; import java.util.stream.Collectors; import java.io.*; import java.util.zip.*; import java.time.LocalDateTime; /** * La classe principale. * * Tous les traitements demandés sont faits dans la mêthode * {@code repondreQuestions}. * Il serait plus logique d'écrire des méthodes qui pemettraient d'améliorer * la structuration et la réutilisation. Cependant l'objectif est ici la * manipulation de l'API des collections, pas la structuration du code * en sous-programmes. */ public class Main { private static void repondreQuestions(Reader in) { Iterable iterable = PointDeVenteUtils.fromXML(in); // Construire un tableau associatif (pdvs) des points de vente avec un // accès par identifiant Map pdvs = new HashMap<>(); for (PointDeVente pt_vente : iterable) { pdvs.put(pt_vente.getIdentifiant(), pt_vente); } // // Nombre de point de vente // int size_pdvs = pdvs.size(); // System.out.println(size_pdvs); // // Afficher le nombre de services existants // Set services = new TreeSet(); // for (PointDeVente pt_vente : pdvs.values()) { // services.addAll(pt_vente.getServices()); // } // int size_service = services.size(); // System.out.println(size_service); // // Afficher les services fournis // for (String service : services) { // System.out.println(service); // } // Afficher la ville correspondant au point de vente d'identifiant 31075001 // PointDeVente pdv_id = pdvs.get(31075001L); // System.out.println(pdv_id.getVille()); // // et le prix du gazole le 25 janvier 2018 à 10h. // System.out.println(pdv_id.getPrix(Carburant.GAZOLE, LocalDateTime.parse("2018-01-25T10:00:00"))); // Afficher le nombre de villes offrant au moins un point de vente // Set ville_nbpdv = new TreeSet(); // for (PointDeVente pointDeVente : pdvs.values()) { // ville_nbpdv.add(pointDeVente.getVille()); // } // System.out.println(ville_nbpdv.size()); // Afficher le nombre moyen de points de vente par ville Map ville_pdvmoyen = new HashMap<>(); for (PointDeVente pointDeVente : pdvs.values()) { int count = ville_pdvmoyen.containsKey(pointDeVente.getVille()) ? ville_pdvmoyen.get(pointDeVente.getVille()) : 0; ville_pdvmoyen.put(pointDeVente.getVille(), count + 1); } int total = 0; for (Integer i : ville_pdvmoyen.values()) { System.out.println(i); total += i; } System.out.println(total/ville_pdvmoyen.size()); // A finir... // le nombre de villes offrants un certain nombre de carburants // Afficher le nombre et les points de vente dont le code postal est 31200 // Nombre de PDV de la ville de Toulouse qui proposent et du Gazole // et du GPLc. // Afficher le nom et le nombre de points de vente des villes qui ont au // moins 20 points de vente } private static Reader ouvrir(String nomFichier) throws FileNotFoundException, IOException { if (nomFichier.endsWith(".zip")) { // On suppose que l'archive est bien formée : // elle contient fichier XML ! ZipFile zfile = new ZipFile(nomFichier); ZipEntry premiere = zfile.entries().nextElement(); return new InputStreamReader(zfile.getInputStream(premiere)); } else { return new FileReader(nomFichier); } } public static void main(String[] args) { if (args.length != 1) { System.out.println("usage : java Main "); } else { try (Reader in = ouvrir(args[0])) { repondreQuestions(in); } catch (FileNotFoundException e) { System.out.println("Fichier non trouvé : " + args[0]); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } } }