diff --git "a/Exercices/corrig\303\251/serie9/Individu.java" "b/Exercices/corrig\303\251/serie9/Individu.java" new file mode 100644 index 0000000000000000000000000000000000000000..dfcd05addac14e51f3fca2d8dd0e7c8df069d043 --- /dev/null +++ "b/Exercices/corrig\303\251/serie9/Individu.java" @@ -0,0 +1,104 @@ +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.Month; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import java.io.Serializable; +import java.util.List; + +public class Individu implements Serializable { + // Enum pour les lieux de naissance + public enum LieuxDeNaissance { + TOKYO, PARIS, NAIROBI, LOS_ANGELES, BAMAKO, MOSCOU, CARACAS, TBILISSI + } + + // Enum pour les hobbies + public enum Hobbies { + JEUX_VIDEO, SPORT, RANDONNÉE, SKI, CINÉMA, CUISINE, LECTURE + } + + // Attributs privés + private final int taille; + private final LocalDateTime dateDeNaissance; + private final LieuxDeNaissance lieuDeNaissance; + private final int poids; + private final List<Hobbies> hobbies; + + // Constructeur + public Individu(int taille, LocalDateTime dateDeNaissance, LieuxDeNaissance lieuDeNaissance, int poids, List<Hobbies> hobbies) { + if (taille < 150 || taille > 190) { + throw new IllegalArgumentException("La taille doit être comprise entre 150cm et 190cm."); + } + if (poids < 60 || poids > 100) { + throw new IllegalArgumentException("Le poids doit être compris entre 60kg et 100kg."); + } + this.taille = taille; + this.dateDeNaissance = dateDeNaissance; + this.lieuDeNaissance = lieuDeNaissance; + this.poids = poids; + this.hobbies = hobbies; + } + + // Getters + public int getTaille() { + return taille; + } + + public LocalDateTime getDateDeNaissance() { + return dateDeNaissance; + } + + public LieuxDeNaissance getLieuDeNaissance() { + return lieuDeNaissance; + } + + public int getPoids() { + return poids; + } + + public List<Hobbies> getHobbies() { + return hobbies; + } + + // Affichage lisible + @Override + public String toString() { + return String.format("Né le %s à %s, mesure %dcm, pèse %dkg, aime %s", + dateDeNaissance.toLocalDate(), + lieuDeNaissance, + taille, + poids, + hobbies.toString().replace("[", "").replace("]", "")); + } + + // Affichage formaté pour la sauvegarde dans un fichier + public String toCSV() { + return String.format( + "%s,%s,%d,%d,%s", + dateDeNaissance.toLocalDate(), + lieuDeNaissance, + taille, + poids, + String.join(";", hobbies.stream().map(Enum::name).toList()) + ); + } + + // Création d'un individu à partir d'une ligne CSV + public static Individu fromCSV(String csvLine) { + String[] parts = csvLine.split(","); + LocalDateTime dateDeNaissance = LocalDateTime.of( + LocalDate.parse(parts[0]), + LocalTime.of(0, 0) + ); + LieuxDeNaissance lieuDeNaissance = LieuxDeNaissance.valueOf(parts[1]); + int taille = Integer.parseInt(parts[2]); + int poids = Integer.parseInt(parts[3]); + List<Hobbies> hobbies = Arrays.stream(parts[4].split(";")) + .map(Hobbies::valueOf) + .toList(); + return new Individu(taille, dateDeNaissance, lieuDeNaissance, poids, hobbies); + } +} diff --git "a/Exercices/corrig\303\251/serie9/IndividuUtils.java" "b/Exercices/corrig\303\251/serie9/IndividuUtils.java" new file mode 100644 index 0000000000000000000000000000000000000000..3093f6829870300ae4650d26d2188b43adf0c96d --- /dev/null +++ "b/Exercices/corrig\303\251/serie9/IndividuUtils.java" @@ -0,0 +1,53 @@ +import java.time.LocalDateTime; +import java.time.Month; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class IndividuUtils { + + private static final Random RANDOM = new Random(); + + public static Individu createIndividu() { + int taille = 150 + RANDOM.nextInt(41); + int poids = 60 + RANDOM.nextInt(41); + + int year = 1990 + RANDOM.nextInt(35); + int month = 1 + RANDOM.nextInt(12); + int day = 1 + RANDOM.nextInt( + LocalDateTime.of( + year, month, 1, 0, 0).getMonth().length(false) + ); + int hour = RANDOM.nextInt(24); + int minute = RANDOM.nextInt(60); + + LocalDateTime dateDeNaissance = LocalDateTime.of(year, month, day, hour, minute); + + Individu.LieuxDeNaissance lieuDeNaissance = Individu.LieuxDeNaissance.values()[ + RANDOM.nextInt(Individu.LieuxDeNaissance.values().length) + ]; + + List<Individu.Hobbies> hobbiesList = Arrays.asList(Individu.Hobbies.values()); + List<Individu.Hobbies> hobbies = new ArrayList<>(); + int numberOfHobbies = 1 + RANDOM.nextInt(hobbiesList.size()); + + for (int i = 0; i < numberOfHobbies; i++) { + Individu.Hobbies hobby; + do { + hobby = hobbiesList.get(RANDOM.nextInt(hobbiesList.size())); + } while (hobbies.contains(hobby)); + hobbies.add(hobby); + } + + return new Individu(taille, dateDeNaissance, lieuDeNaissance, poids, hobbies); + } + + public static List<Individu> createIndividus(int n) { + List<Individu> individus = new ArrayList<>(); + for (int i = 0; i < n; i++) { + individus.add(createIndividu()); + } + return individus; + } +} diff --git "a/Exercices/corrig\303\251/serie9/Test0.java" "b/Exercices/corrig\303\251/serie9/Test0.java" new file mode 100644 index 0000000000000000000000000000000000000000..397c50303bae1949d04b9c1ac54402698f7727e5 --- /dev/null +++ "b/Exercices/corrig\303\251/serie9/Test0.java" @@ -0,0 +1,16 @@ +import java.util.List; + +public class Test0 { + public static void main(String[] args) { + System.out.println("Création d'un individu aléatoire :"); + Individu individu = IndividuUtils.createIndividu(); + System.out.println(individu); + + System.out.println(); + System.out.println("Création de 5 individus aléatoires :"); + List<Individu> individus = IndividuUtils.createIndividus(5); + for (Individu i : individus) { + System.out.println(i); + } + } +} diff --git "a/Exercices/corrig\303\251/serie9/Test1.java" "b/Exercices/corrig\303\251/serie9/Test1.java" new file mode 100644 index 0000000000000000000000000000000000000000..2201f017bcc7b5ed75d105d68bfea5bc931481e2 --- /dev/null +++ "b/Exercices/corrig\303\251/serie9/Test1.java" @@ -0,0 +1,80 @@ +import java.time.Month; +import java.util.*; +import java.util.stream.Collectors; + +public class Test1 { + public static void main(String[] args) { + // Générer une liste de 100 individus aléatoires + List<Individu> individus = IndividuUtils.createIndividus(100); + + // 1. Afficher tous les individus nés en 2000 au mois de mars + System.out.println("Individus nés en 2000 au mois de mars :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 2000) + .filter(i -> i.getDateDeNaissance().getMonth() == Month.MARCH) + .forEach(System.out::println); + + // 2. Afficher les 5 premiers individus nés en juillet 1993 + System.out.println("\nLes 5 premiers individus nés en juillet 1993 :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 1993) + .filter(i -> i.getDateDeNaissance().getMonth() == Month.JULY) + .limit(5) + .forEach(System.out::println); + + // 3. Afficher le nombre total d'individus nés en 1994 + long count1994 = individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 1994) + .count(); + System.out.println("\nNombre total d'individus nés en 1994 : " + count1994); + + // 4. Afficher les 5 plus grands individus nés au mois de décembre de l'année 2001 + System.out.println("\nLes 5 plus grands individus nés en décembre 2001 :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 2001) + .filter(i -> i.getDateDeNaissance().getMonth() == Month.DECEMBER) + .sorted(Comparator.comparingInt(Individu::getTaille).reversed()) + .limit(5) + .forEach(System.out::println); + + // 5. Afficher les 5 plus petits individus de taille au moins 180cm nés en 2002 + System.out.println("\nLes 5 plus petits individus (≥ 180cm) nés en 2002 :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 2002) + .filter(i -> i.getTaille() >= 180) + .sorted(Comparator.comparingInt(Individu::getTaille)) + .limit(5) + .forEach(System.out::println); + + // 6. Afficher les 5 plus petits individus de taille au moins 180cm nés en 2002 par ordre décroissant de taille + System.out.println("\nLes 5 plus petits individus (≥ 180cm) nés en 2002 (ordre décroissant) :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 2002) + .filter(i -> i.getTaille() >= 180) + .sorted(Comparator.comparingInt(Individu::getTaille).reversed()) + .limit(5) + .forEach(System.out::println); + + // 7. Afficher la liste (sans redondance) des hobbies des 5 plus lourds parmi les 20 plus grands individus nés en 1999 + System.out.println("\nHobbies (sans redondance) des 5 plus lourds parmi les 20 plus grands nés en 1999 :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 1999) + .sorted(Comparator.comparingInt(Individu::getTaille).reversed()) + .limit(20) + .sorted(Comparator.comparingInt(Individu::getPoids).reversed()) + .limit(5) + .flatMap(i -> i.getHobbies().stream()) + .distinct() + .forEach(System.out::println); + + // 8. Afficher la liste (sans redondance) des mois de naissance des 20 plus grands individus nés en 1997 + System.out.println("\nMois de naissance (sans redondance) des 20 plus grands nés en 1997 :"); + individus.stream() + .filter(i -> i.getDateDeNaissance().getYear() == 1997) + .sorted(Comparator.comparingInt(Individu::getTaille).reversed()) + .limit(20) + .map(i -> i.getDateDeNaissance().getMonth()) + .distinct() + .forEach(System.out::println); + } +} diff --git "a/Exercices/corrig\303\251/serie9/Test2.java" "b/Exercices/corrig\303\251/serie9/Test2.java" new file mode 100644 index 0000000000000000000000000000000000000000..c0f932e79a3cddf377bf4bbab174919d516bf34d --- /dev/null +++ "b/Exercices/corrig\303\251/serie9/Test2.java" @@ -0,0 +1,130 @@ +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.Month; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.io.File; +import java.io.FileWriter; +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.IOException; + +public class Test2 { + // Méthode surchargée pour contrôler le type de liste (ArrayList) + public static List<Individu> createIndividusArrayList(int n) { + return new ArrayList<>(IndividuUtils.createIndividus(n)); + } + + // Méthode surchargée pour contrôler le type de liste (LinkedList) + public static List<Individu> createIndividusLinkedList(int n) { + return new LinkedList<>(IndividuUtils.createIndividus(n)); + } + + // Méthode surchargée pour contrôler la source avec Supplier + public static List<Individu> createIndividus(Supplier<Individu> supplier, int n) { + List<Individu> individus = new ArrayList<>(); + for (int i = 0; i < n; i++) { + individus.add(supplier.get()); + } + return individus; + } + + // Méthode test pour afficher la liste des individus + public static void test(List<Individu> individus) { + individus.forEach(individu -> { + System.out.println(individu); + System.out.println("Hobbies: " + individu.getHobbies()); + }); + } + + // Méthode surchargée pour effectuer l'action de "sortie" + public static void testWithConsumer(List<Individu> individus, Consumer<Individu> consumer) { + individus.forEach(consumer); + } + + // Consumer pour écrire dans un fichier + public static Consumer<Individu> writeToFileConsumer(String fileName) { + return individu -> { + try (FileWriter writer = new FileWriter(fileName, true)) { + writer.write(individu.toCSV() + "\n"); + } catch (IOException e) { + e.printStackTrace(); + } + }; + } + + // Supplier pour lire depuis un fichier + public static Supplier<Individu> readFromFileSupplier(String fileName) { + return new Supplier<>() { + private BufferedReader reader; + { + try { + reader = new BufferedReader(new FileReader(new File(fileName))); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public Individu get() { + try { + if (reader != null) { + String line = reader.readLine(); + if (line != null) { + return Individu.fromCSV(line); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + }; + } + + // Main pour tester les méthodes + public static void main(String[] args) { + System.out.println("Créer des individus avec ArrayList :"); + List<Individu> individusArrayList = createIndividusArrayList(5); + test(individusArrayList); + + System.out.println("\nCréer des individus avec LinkedList :"); + List<Individu> individusLinkedList = createIndividusLinkedList(5); + test(individusLinkedList); + + System.out.println("\nCréer des individus avec Supplier :"); + Supplier<Individu> singleSupplier = () -> new Individu( + 170, + LocalDateTime.of(1995, Month.JANUARY, 1, 0, 0), + Individu.LieuxDeNaissance.PARIS, + 70, + List.of(Individu.Hobbies.CINÉMA, Individu.Hobbies.SPORT) + ); + + // ou + // Supplier<Individu> singleSupplier = () -> IndividuUtils.createFixedIndividu(); + + List<Individu> individusFromSupplier = createIndividus(singleSupplier, 3); + test(individusFromSupplier); + + System.out.println("\nTester avec un Consumer :"); + String fileName = "individus.csv"; + Consumer<Individu> fileWriterConsumer = writeToFileConsumer(fileName); + testWithConsumer(individusArrayList, fileWriterConsumer); + + System.out.println("\nLire depuis le fichier avec Supplier :"); + Supplier<Individu> fileReaderSupplier = readFromFileSupplier(fileName); + Individu individuFromFile; + while ((individuFromFile = fileReaderSupplier.get()) != null) { + System.out.println("Lu depuis le fichier : " + individuFromFile); + } + } +}