Skip to content
Snippets Groups Projects
Commit 803d4ad9 authored by stephane.malandai's avatar stephane.malandai
Browse files

Update 5 files

- /Exercices/corrigé/serie9/Individu.java
- /Exercices/corrigé/serie9/IndividuUtils.java
- /Exercices/corrigé/serie9/Test0.java
- /Exercices/corrigé/serie9/Test1.java
- /Exercices/corrigé/serie9/Test2.java
parent 00a93dd6
Branches
No related tags found
No related merge requests found
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);
}
}
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;
}
}
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);
}
}
}
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);
}
}
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);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment