Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
  • z22024794/prog-av-exercices-fadl-zemzem
  • n23017542/progavexercices
  • l23024794/saratp-1
  • d24029849/progavexercices
  • gnaves/progavexercices
5 results
Select Git revision
  • master
1 result
Show changes
Commits on Source (2)
Showing with 660 additions and 0 deletions
package fr.univamu.progav.td7;
import java.util.Iterator;
import java.util.NoSuchElementException;
/** A class to represent sets of consecutive integers.
* @param mini the smallest integer in the set.
* @param maxi the largest integer in the set. If maxi < mini, the set is empty.
*/
public record Interval(int mini, int maxi) implements Iterable<Integer> {
/**
* @param i an arbitrary integer
* @return true if i is in the set
*/
public boolean contains(int i) {
// TODO
return false;
}
/**
* @return the number of integers in the set.
*/
public int size() {
// TODO
return -1;
}
/**
* @return true if this is empty.
*/
public boolean isEmpty() {
// TODO
return false;
}
/** Decide whether two intervals intersect each other.
* @param range the second interval
* @return true if this and range intersect
*/
public boolean intersects(Interval range) {
// TODO
return false;
}
/**
* @return an iterator over the integers in the set
*/
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
// TODO ajouter une propriété pour le prochain élément
@Override
public boolean hasNext() {
// TODO
return false;
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
// TODO
return null;
}
} ;
}
}
package fr.univamu.progav.td7;
public class IntervalSequences {
public static boolean containsEmptyInterval(Sequence<Interval> intervals) {
// TODO
return false;
}
public static int sumOfSizes(Sequence<Interval> intervals) {
// TODO
return -1;
}
public static Interval longestInterval(Sequence<Interval> intervals) {
// TODO
return null;
}
}
package fr.univamu.progav.td7;
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Predicate;
public interface Sequence<T> {
void forEach(Consumer<T> action);
boolean anyMatch(Predicate<T> predicate);
T maximum(Comparator<T> compare);
}
Cette semaine les exercices portent sur les classes anonymes, les lambdas et
les références de méthodes.
Exercice 1
==========
Compléter la classe ```Interval``` qui représente des ensembles d'entiers
consécutifs, comme $\{3,4,5,6,7\}$.
Pour la méthode ```iterator```, compléter la classe anonyme. Il faudra
ajouter une propriété pour retenir le prochain entier de l'itération.
Vérifier votre travail avec les tests de la classe ```IntervalTest```.
Exercice 2
==========
Une ```Sequence<T>``` ressemble à une ```List<T>```, mais on ne nous donne
que des méthodes nécessitant un argument fonctionnel.
- ```forEach``` demande un ```Consumer<T>```, une action qui sera appliquée
à chaque élément de la séquence. L'interface ```Consumer<T>``` est définie
par
```java
interface Consumer<T> {
void accept(T value);
}
```
- ```anyMatch``` demande un ```Predicate<T>```, un prédicat pouvant être
appliqué aux éléments de la séquence. ```anyMatch``` renvoie ```true``` si au
moins un des éléments de la séquence satisfait le prédicat. L'interface
```Predicate<T>``` est définie par
```java
interface Predicate<T> {
boolean test(T value);
}
```
- ```maximum``` demande un ```Comparator<T>```, un objet capable de décider
quel est la plus grande de 2 valeurs de type ```T```. L'interface
```Comparator<T>``` est définie par
```java
interface Comparator<T> {
int compare(T t1, T t2);
}
```
Compléter les méthodes statiques de la classe ```IntervalSequence```. Pour
cela :
- pour ```containsEmptyInterval```, utiliser une référence de méthode pour
définir le prédicat "est vide" des intervalles.
- Pour ```sumOfSizes```, essayer d'utiliser une lambda avec un compteur
de type ```int```. Cela ne va pas fonctionner, pourquoi ?
- Introduire une interface correspondant à un compteur entier :
```java
interface IntCounter {
void add(int value);
int get();
}
```
- Dans ```sumOfSizes```, créer un compteur à l'aide d'une classe anonyme,
puis utiliser ```forEach``` sur la séquence avec une lambda pour augmenter
le compteur.
- Dans ```longestInterval```, utiliser une lambdas.
- Vérifier votre travail avec les tests de la classe
```IntervalSequencesTest```.
package fr.univamu.progav.td8;
import fr.univamu.progav.td1.ExercicesBoucles;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ExercicesStream {
public interface Person {
int age();
String name();
boolean isFemale();
Person mother();
Person father();
List<Person> children();
}
// Exercice : compléter toutes les méthodes suivantes
// retourne vrai si la stream contient une femme
public static boolean hasFemale(Stream<Person> persons) {
// TODO
return false;
}
// retourne vrai si la stream contient un individu homme et mineur (moins de 18 ans)
public static boolean containsMinorMale(Stream<Person> persons) {
// TODO
return false;
}
// retourne un individu de la stream, femme et ayant au moins un enfant,
// null si aucun individu ne convient
public static Optional<Person> findMother(Stream<Person> persons) {
// TODO
return Optional.empty();
}
// retourne vrai si tous les individus de la stream sont majeurs (âge >= 18)
public static boolean areAllMajor(Stream<Person> persons) {
// TODO
return false;
}
// retourne la liste de tous les hommes de la stream.
public static List<Person> males(Stream<Person> persons) {
// TODO
return List.of();
}
// retourne le nombre de femmes de la stream
public static long nbFemales(Stream<Person> persons) {
// TODO
return 0L;
}
// trouve un individu de la stream ayant un enfant, et retourne l'âge
// de cet enfant.
public static Optional<Integer> ageOfSomeChild(Stream<Person> persons) {
// TODO
return Optional.empty();
}
// retourne la personne la plus agée de la stream,
public static Optional<Person> eldest(Stream<Person> persons) {
// TODO
return Optional.empty();
}
// retourne une chaîne de caractères, comprenant les noms de toutes les
// personnes de la stream, dans l'ordre, séparés par une espace.
public static String names(Stream<Person> persons) {
// TODO
return "";
}
// retourne l'âge moyen des individus de la stream
public static OptionalDouble averageAge(Stream<Person> persons) {
// TODO
return OptionalDouble.empty();
}
private static class SexCount {
// TODO ajouter des propriétés pour compter le nombre d'hommes et de femmes
SexCount() {}
void add(Person p) {
// TODO dénombrer p dans les statistiques
}
void merge(SexCount count) {
// TODO fusionner les statistiques
}
boolean areEquals() {
// TODO renvoyer vrai si les nombres de femmes et d'hommes sont égaux
return false;
}
}
// retourne vrai si les nombres d'hommes et de femmes sont égaux.
public static boolean hasAsManyMalesAsFemales(Stream<Person> persons) {
Supplier<SexCount> supplier = null; // TODO initialiser les 3 variables.
BiConsumer<SexCount, Person> accumulator = null;
BiConsumer<SexCount,SexCount> combiner = null;
return persons
.collect(supplier,accumulator,combiner)
.areEquals();
}
}
Exercice
========
Compléter les méthodes de la classe `ExercicesStream`.
Vous devez utiliser des Stream. Il est interdit d'utiliser des boucles ou
des récursions. Il est interdit de convertir les streams en listes (sauf
pour calculer la liste à retourner dans la méthode ```males```). Toutes
les méthodes doivent avoir une seule instruction, l'instruction ```return```.
La dernière méthode est la plus difficile, elle demande de construire un
collecteur à partir de trois éléments :
- un ```Supplier<R>```, ```R``` étant le type des objets effectuant la
collection, disons un collecteur. Ce ```Supplier``` permet de créer un
nouveau collecteur;
- un ```BiConsumer<R,People>```, qui est une fonction prenant un collecteur
et une personne collectée. C'est en général la méthode du collecteur
chargé d'accepter les personnes collectées l'une après l'autre. Le
collecteur met à jour son état interne pour tenir compte de la personne
collectée.
- un ```BiConsumer<R,R>```, qui est une fonction permettant de fusionner le
travail de deux collecteurs. Le premier collecteur agrège les données
récoltées par le deuxième collecteur dans son état interne.
Pour nous, le collecteur est un objet calculant le nombre de personnes de
chaque sexe. Le premier argument sera donc son constructeur, le deuxième
sera sa méthode ```add```, et le troisième sa méthode ```merge```, chacun
pouvant être donné par une référence de méthode. Une fois le collecteur
effectué, il reste à utiliser la méthode ```areEquals()``` pour déterminer
si le nombre de femmes est égal au nombre d'hommes.
Tous les tests de ```ExercicesStreamTest``` doivent passer à la fin de
l'exercice.
\ No newline at end of file
package fr.univamu.progav.td7;
import org.junit.jupiter.api.Test;
import static fr.univamu.progav.td7.IntervalSequences.*;
import static org.junit.jupiter.api.Assertions.*;
class IntervalSequencesTest {
private final Sequence<Interval> seq1 = new ListSequence<>(
new Interval(2,8),
new Interval(-4,5),
new Interval(3,-2),
new Interval(-9,-3)
);
private final Sequence<Interval> seq2 = new ListSequence<>(
new Interval(0,0),
new Interval(0,10),
new Interval(-10,5),
new Interval(-3,-3)
);
private final Sequence<Interval> seqEmpty = new ListSequence<>();
@Test
void testContainsEmptyInterval() {
assertTrue(containsEmptyInterval(seq1));
assertFalse(containsEmptyInterval(seq2));
assertFalse(containsEmptyInterval(seqEmpty));
}
@Test
void testSumOfSizes() {
assertEquals(24, sumOfSizes(seq1));
assertEquals(29, sumOfSizes(seq2));
assertEquals(0, sumOfSizes(seqEmpty));
}
@Test
void testLongestInterval() {
assertEquals(10,longestInterval(seq1).size());
assertEquals(16,longestInterval(seq2).size());
assertNull(longestInterval(seqEmpty));
}
}
\ No newline at end of file
package fr.univamu.progav.td7;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import static org.junit.jupiter.api.Assertions.*;
class IntervalTest {
@Test
void contains() {
Interval range = new Interval(-2, 5);
assertTrue(range.contains(-2));
assertTrue(range.contains(0));
assertTrue(range.contains(1));
assertTrue(range.contains(4));
assertTrue(range.contains(5));
assertFalse(range.contains(-3));
assertFalse(range.contains(-30));
assertFalse(range.contains(6));
assertFalse(range.contains(42));
assertFalse(range.contains(2904429));
}
@Test
void size() {
assertEquals(5, new Interval(0,4).size());
assertEquals(0, new Interval(4,0).size());
assertEquals(6, new Interval(4,9).size());
assertEquals(7, new Interval(-7,-1).size());
assertEquals(8, new Interval(-3,4).size());
assertEquals(1, new Interval(3,3).size());
}
@Test
void isEmpty() {
assertTrue(new Interval(5,3).isEmpty());
assertTrue(new Interval(2,-5).isEmpty());
assertTrue(new Interval(0,-1).isEmpty());
assertTrue(new Interval(1,0).isEmpty());
assertFalse(new Interval(1,1).isEmpty());
assertFalse(new Interval(0,0).isEmpty());
assertFalse(new Interval(-3,3).isEmpty());
}
@Test
void intersects() {
assertTrue(new Interval(1,5).intersects(new Interval(2,3)));
assertTrue(new Interval(-5,5).intersects(new Interval(-3,-2)));
assertTrue(new Interval(-5,5).intersects(new Interval(-2,3)));
assertTrue(new Interval(-5,5).intersects(new Interval(-6,-5)));
assertTrue(new Interval(-5,5).intersects(new Interval(5,7)));
assertTrue(new Interval(-3,4).intersects(new Interval(-4,8)));
assertFalse(new Interval(-3,4).intersects(new Interval(2,-2)));
assertFalse(new Interval(-3,4).intersects(new Interval(5,8)));
assertFalse(new Interval(-3,4).intersects(new Interval(-7,-4)));
assertFalse(new Interval(-3,4).intersects(new Interval(12,35)));
assertFalse(new Interval(-3,4).intersects(new Interval(67,-21)));
}
@Test
void iterator() {
Iterator<Integer> iterator = new Interval(-2,8).iterator();
List<Integer> elements = new ArrayList<>();
while (iterator.hasNext()) {
elements.add(iterator.next());
}
assertEquals(List.of(-2,-1,0,1,2,3,4,5,6,7,8), elements);
assertThrows(NoSuchElementException.class, iterator::next, "Iterator.next() must throw NoSuchElementException when iteration is over");
iterator = new Interval(0,-1).iterator();
assertFalse(iterator.hasNext());
assertThrows(NoSuchElementException.class, iterator::next, "Iterator.next() must throw NoSuchElementException when iteration is over");
}
}
\ No newline at end of file
package fr.univamu.progav.td7;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class ListSequence<T> implements Sequence<T> {
// Ne pas modifier cette classe !
private final List<T> elements;
public ListSequence(List<T> elements) {
this.elements = elements;
}
@SafeVarargs
public ListSequence(T... elements) {
this.elements = Arrays.asList(elements);
}
public void forEach(Consumer<T> action) {
elements.forEach(action);
}
public boolean anyMatch(Predicate<T> predicate) {
return elements.stream().anyMatch(predicate);
}
public T maximum(Comparator<T> compare) {
return elements.stream().max(compare).orElse(null);
}
}
package fr.univamu.progav.td8;
import fr.univamu.progav.td8.ExercicesStream;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static fr.univamu.progav.td8.ExercicesStream.Person;
import static org.junit.jupiter.api.Assertions.*;
class ExercicesStreamTest {
private record MockPerson(
int age,
String name,
boolean isFemale,
Person mother,
Person father,
List<Person> children
) implements Person {
@Override
public String toString() {
return this.name;
}
}
private static final Person alfa =
new MockPerson(78,"Alfa",true,null,null, new ArrayList<>());
private static final Person bravo =
new MockPerson(82,"Bravo",false,null,null, new ArrayList<>());
private static final Person charlie =
new MockPerson(42,"Charlie",false, alfa,bravo,List.of());
private static final Person delta =
new MockPerson(38,"Delta",false, alfa,bravo, new ArrayList<>());
private static final Person echo =
new MockPerson(41,"Echo",true,null,null, new ArrayList<>());
private static final Person foxtrot =
new MockPerson(7,"Foxtrot",true,echo,delta, List.of());
private static final Person golf =
new MockPerson(25,"Golf",true,null,null, new ArrayList<>());
private static final Person hotel =
new MockPerson(2,"Hotel",false,golf,null, List.of());
private static final Person india =
new MockPerson(8,"India",true,null,null, List.of());
private static final Person juliett =
new MockPerson(18,"Juliett",false,null,null,List.of());
static {
alfa.children().addAll(List.of(charlie, delta));
bravo.children().addAll(List.of(charlie, delta));
delta.children().add(foxtrot);
echo.children().add(foxtrot);
golf.children().add(hotel);
}
private static final List<Person> ALL =
List.of(alfa,bravo,charlie,delta,echo,foxtrot,golf,hotel,india,juliett);
private static Stream<Person> femaleStream() {
return Stream.of(alfa, echo, foxtrot, golf, india);
}
private static Stream<Person> maleStream() {
return Stream.of(bravo,charlie,delta,hotel,juliett);
}
@Test
void hasFemale() {
assertTrue(ExercicesStream.hasFemale(ALL.stream()));
assertFalse(ExercicesStream.hasFemale(Stream.of(bravo,charlie,delta)));
assertTrue(ExercicesStream.hasFemale(Stream.of(alfa)));
assertFalse(ExercicesStream.hasFemale(Stream.of()), "Cas de la stream vide");
}
@Test
void containsMinorMale() {
assertTrue(ExercicesStream.containsMinorMale(ALL.stream()));
assertFalse(ExercicesStream.containsMinorMale(Stream.of(bravo,charlie,delta)), "Pas de mineurs");
assertFalse(ExercicesStream.containsMinorMale(Stream.of(foxtrot,india)), "Pas d'hommes");
assertFalse(ExercicesStream.containsMinorMale(Stream.of()), "Cas de la stream vide");
}
@Test
void findMother() {
Optional<Person> found = ExercicesStream.findMother(ALL.stream());
assertTrue(found.isPresent());
assertTrue(found.get().isFemale() && !found.get().children().isEmpty());
assertEquals(Optional.of(golf),ExercicesStream.findMother(Stream.of(bravo,charlie,delta,golf,hotel,india)));
assertEquals(Optional.empty(), ExercicesStream.findMother(Stream.of(bravo,charlie,delta,foxtrot,hotel,india)));
assertEquals(Optional.empty(), ExercicesStream.findMother(Stream.of()), "Cas de la stream vide");
}
@Test
void areAllMajor() {
assertFalse(ExercicesStream.areAllMajor(ALL.stream()));
assertTrue(ExercicesStream.areAllMajor(Stream.of(alfa,bravo,charlie,delta,echo,golf)));
assertTrue(ExercicesStream.areAllMajor(Stream.of(alfa,bravo,charlie,delta,echo,golf,juliett)), "Cas d'un individu ayant 18 ans");
assertFalse(ExercicesStream.areAllMajor(Stream.of(foxtrot,hotel,india)));
assertTrue(ExercicesStream.areAllMajor(Stream.of()), "Cas de la stream vide");
}
@Test
void ageOfSomeChild() {
Optional<Integer> maybeAge =
ExercicesStream.ageOfSomeChild(Stream.of(hotel, india, juliett, alfa, foxtrot, charlie));
assertTrue(maybeAge.isPresent());
assertTrue(List.of(charlie.age(),delta.age()).contains(maybeAge.get()));
assertTrue(ExercicesStream.ageOfSomeChild(Stream.of(charlie,foxtrot,hotel,india,juliett)).isEmpty());
assertTrue(ExercicesStream.ageOfSomeChild(Stream.of()).isEmpty(),"Cas de la stream vide");
}
@Test
void males() {
List<Person> allMales = ExercicesStream.males(ALL.stream());
List<Person> expected = ALL.stream().filter(p -> !p.isFemale()).toList();
assertNotNull(allMales);
assertEquals(expected.size(), allMales.size(), "Nombre d'hommes incorrect");
for (Person p : expected ) {
assertTrue(allMales.contains(p), p.name() + " est un homme qui n'est pas dans la stream");
}
List<Person> neitherMaleNorFemale = ExercicesStream.males(femaleStream());
assertNotNull(neitherMaleNorFemale);
assertTrue(neitherMaleNorFemale.isEmpty());
List<Person> empty = ExercicesStream.males(Stream.of());
assertNotNull(empty, "Cas de la stream vide");
assertTrue(empty.isEmpty(), "Cas de la stream vide");
}
@Test
void nbFemales() {
assertEquals(0,ExercicesStream.nbFemales(Stream.of()), "Cas de la stream vide");
assertEquals(5,ExercicesStream.nbFemales(ALL.stream()));
assertEquals(0,ExercicesStream.nbFemales(maleStream()));
}
@Test
void eldest() {
assertTrue(ExercicesStream.eldest(Stream.of()).isEmpty(), "Cas de la stream vide");
assertEquals(Optional.of(bravo),ExercicesStream.eldest(ALL.stream()));
}
@Test
void names() {
String allNames = ExercicesStream.names(ALL.stream()).trim();
assertEquals("Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliett",allNames);
assertEquals("",ExercicesStream.names(Stream.of()), "Cas de la liste vide");
}
@Test
void hasAsManyMalesAsFemales() {
assertTrue(ExercicesStream.hasAsManyMalesAsFemales(Stream.of()), "Cas de la liste vide");
assertFalse(ExercicesStream.hasAsManyMalesAsFemales(Stream.of(alfa)));
assertFalse(ExercicesStream.hasAsManyMalesAsFemales(Stream.of(bravo)));
assertFalse(ExercicesStream.hasAsManyMalesAsFemales(femaleStream()));
assertFalse(ExercicesStream.hasAsManyMalesAsFemales(maleStream()));
assertTrue(ExercicesStream.hasAsManyMalesAsFemales(ALL.stream()));
}
@Test
void averageAge() {
assertTrue(ExercicesStream.averageAge(Stream.of()).isEmpty(), "Cas de la liste vide");
OptionalDouble average = ExercicesStream.averageAge(ALL.stream());
assertTrue(average.isPresent());
double expected = 34.1;
assertTrue(Math.abs(average.getAsDouble() - expected) < 0.1, "La moyenne correcte est " + expected);
}
}
\ No newline at end of file