TP - Collections en Java
Objectif
L’objectif ce TP est de présenter l’utilisation des collections.
Partie 1 : Manipulation basique des Sets
- Créez un
HashSet
d’animaux avec les attributs suivants :
public class Animal {
private String nom;
private int age;
private String espece;
private double poids;
private LocalDate dernierExamen;
// Constructeur, getters, setters
// Implémenter equals() et hashCode() basés sur le nom
}
- Implémentez
equals()
ethashCode()
pour définir l’égalité basée sur le nom. - Créez un HashSet
et ajoutez 5 animaux - Démontrez le fonctionnement de l’unicité dans un test unitaire avec Junit5:
@Test
public void testUniciteAnimaux() {
Set<Animal> animaux = new HashSet<>();
= new Animal("Leo", 5, "Lion");
Animal lion1 = new Animal("Leo", 3, "Lion");
Animal lion2 assertTrue(animaux.add(lion1));
assertFalse(animaux.add(lion2));
}
Partie 2 : Parcours et Conversion
- Implantez deux méthodes de parcours différentes :
- Avec un Iterator classique
- Avec un forEach (Java 8+)
- Implémentez Comparable
pour trier par nom. - Convertissez votre HashSet en TreeSet en implémentant
Comparable<Animal>
:
- Démontrez la différence entre List et Set :
- Créez une ArrayList à partir de votre Set
- Ajoutez des doublons
- Créez différents Comparator
:
Comparator<Animal> parPoids = ...
Comparator<Animal> parDernierExamen = ...
- Trier et afficher les animaux selon ces critères
Partie 3 : Collections spécialisées
- Créez une classe
Tatouage
immuable
public final class Tatouage {
private final String espece;
private final int numero;
// Constructeur, equals, hashCode
}
- Ajoutez un attribut
tatouage
à la classeAnimal
- Implémentez un système de gestion d’animaux à partir de :
public class Clinique {
private Map<Tatouage, Animal> registre;
private Queue<Animal> salleAttente;
public void ajouterAnimal(Animal animal) {
// À implémenter
}
public Animal chercherAnimal(Tatouage tatouage) {
// À implémenter
}
public void ajouterSalleAttente(Tatouage tatouage) {
// Vérifier si l'animal est dans le registre
// À implémenter
}
public Animal prochaineConsultation() {
// Retirer et retourner le prochain animal de la salle d'attente
// À implémenter
}
}
Simulateur d’un Réseau de Capteurs avec Génération de Mesures Basée sur des Fonctions
Objectif
L’objectif de cet exercice est de créer un réseau de capteurs capable de générer des mesures basées sur des fonctions mathématiques. Vous allez implémenter plusieurs classes pour modéliser les capteurs, les mesures, et le réseau de capteurs, ainsi qu’une classe pour générer des mesures en fonction du temps.
Cet exercice reprend tous les concepts vus depuis le début y compris les collections avec une illustration du typage fort avec l’utilisation d’un standard et d’une librairie pour gérer les unités dans les mesures https://belief-driven-design.com/java-measurement-jsr-385-210f2/
Cette partie sera traitées avec Git AVEC LE LIEN GITHUBCLASSROOM “TP-Collection” fourni
Étapes de l’exercice
- Création de l’interface
Function
Créez une interface Function
qui représente une fonction mathématique prenant le temps en secondes comme entrée et retournant un double comme sortie. Ajoutez la méthode apply(long x)
pour évaluer la fonction à un instant donné.
- Implémentation de la classe
Sensor
Créez une classe Sensor générique qui peut stocker des mesures de différents types de quantités (par exemple, température, pression). Ajoutez des méthodes pour ajouter des mesures et itérer sur celles-ci.
- Implémentation de la classe
Measurement
Créez une classe Measurement pour représenter une mesure prise par un capteur à un instant donné. Incluez des attributs pour le capteur, le timestamp, et la valeur de la mesure.
- Implémentation de la classe
SensorNetwork
Créez une classe SensorNetwork pour gérer un ensemble de capteurs. Ajoutez des méthodes pour ajouter des capteurs de température et de pression, et pour itérer sur les capteurs du réseau.
- Implémentation de la classe
FunctionBasedMeasureGenerator
Créez une classe FunctionBasedMeasureGenerator pour générer des mesures basées sur une fonction mathématique. Ajouter une méthode generate
qui génère des mesures pour un capteur donné sur une période de temps spécifiée.
- Création de l’application principale
App
Créez une classe App
avec une méthode main pour initialiser un réseau de capteurs, ajouter des capteurs, et générer des mesures pour ces capteurs. Utilisez la classe FunctionBasedMeasureGenerator
pour générer des mesures de température basées sur une fonction linéaire simple.
Question bonus
- Ajoutez des méthodes à la classe
Sensor
pour calculer la moyenne des mesures, le min, et le max. (Après Java 8 voirDoubleSummaryStatistics
) - Déléguer cela dans la classe
SensorNetwork
pour tous les capteurs du réseau.
- Ajoutez des méthodes à la classe
Super Bonus.
Proposer une solution pour détecter les anomalies dans les mesures par exemple en utilisant le z-score.
Une illustration du diagramme de classe et du programmes principal possible est donné ci-dessous.
// Create a sensor network
= SensorNetwork.of("Sensor network 1");
SensorNetwork sensorNetwork1
// Add temperature and pressure sensors to the network
<Temperature> sensor1 = sensorNetwork1.addTemperatureSensor("T_1");
Sensor
<Pressure> sensor2 = sensorNetwork1.addPressureSensor("P_1");
Sensor
// Add initial measurements to the sensors
.addMeasurement(Instant.now(), Quantities.getQuantity(25, Units.CELSIUS))
sensor1.addMeasurement(Instant.now().plusSeconds(15), Quantities.getQuantity(300.15, Units.KELVIN));
.addMeasurement(Instant.now(), Quantities.getQuantity(1013.25, Units.PASCAL));
sensor2
// Create a function-based measure generator for temperature
<Temperature> temperatureGenerator = FunctionBasedMeasureGenerator.<Temperature>builder()
FunctionBasedMeasureGenerator.function(
new Function() {
@Override
public double apply(long x) {
// Simple linear function: temperature increases by 1 degree per second
return 20 + 1 * x;
}
})
.startTime(Instant.now())
.endTime(Instant.now().plusSeconds(10))
.timeStep(Duration.of(1, java.time.temporal.ChronoUnit.SECONDS))
.variance(2)
.outlierProbability(0.1)
.build();
// Generate measurements for the temperature sensor
.generate(sensor1, Units.CELSIUS);
temperatureGenerator
// Log the sensor network details
.info("{}", sensorNetwork1);
log
// Iterate over the sensors in the network
Iterator<Sensor> sensorIterator = sensorNetwork1.sensorIterator();
while (sensorIterator.hasNext()) {
= sensorIterator.next();
Sensor sensor .info("{}", sensor);
log
// Iterate over the measurements of each sensor
Iterator<Measurement> measurementIterator = sensor.measurementIterator();
while (measurementIterator.hasNext()) {
= measurementIterator.next();
Measurement measurement .info("{}", measurement);
log}
}