Skip to content
Snippets Groups Projects
Commit c7301d1b authored by Guyslain's avatar Guyslain
Browse files

TD 7 classes anonymes et lambdas

parent 0f7474b5
Branches
No related tags found
No related merge requests found
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.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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment