From c7301d1b2f6dcdee42d6ce2ca6865805cf367f85 Mon Sep 17 00:00:00 2001
From: Guyslain <guyslain.naves@lis-lab.fr>
Date: Tue, 5 Nov 2024 10:11:35 +0100
Subject: [PATCH] TD 7 classes anonymes et lambdas

---
 .../java/fr/univamu/progav/td7/Interval.java  | 70 ++++++++++++++++
 .../univamu/progav/td7/IntervalSequences.java | 22 ++++++
 .../java/fr/univamu/progav/td7/Sequence.java  | 14 ++++
 src/main/java/fr/univamu/progav/td7/TD7.md    | 69 ++++++++++++++++
 .../progav/td7/IntervalSequencesTest.java     | 44 +++++++++++
 .../fr/univamu/progav/td7/IntervalTest.java   | 79 +++++++++++++++++++
 .../fr/univamu/progav/td7/ListSequence.java   | 37 +++++++++
 7 files changed, 335 insertions(+)
 create mode 100644 src/main/java/fr/univamu/progav/td7/Interval.java
 create mode 100644 src/main/java/fr/univamu/progav/td7/IntervalSequences.java
 create mode 100644 src/main/java/fr/univamu/progav/td7/Sequence.java
 create mode 100644 src/main/java/fr/univamu/progav/td7/TD7.md
 create mode 100644 src/test/java/fr/univamu/progav/td7/IntervalSequencesTest.java
 create mode 100644 src/test/java/fr/univamu/progav/td7/IntervalTest.java
 create mode 100644 src/test/java/fr/univamu/progav/td7/ListSequence.java

diff --git a/src/main/java/fr/univamu/progav/td7/Interval.java b/src/main/java/fr/univamu/progav/td7/Interval.java
new file mode 100644
index 0000000..99a7ee5
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td7/Interval.java
@@ -0,0 +1,70 @@
+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;
+      }
+    } ;
+  }
+}
diff --git a/src/main/java/fr/univamu/progav/td7/IntervalSequences.java b/src/main/java/fr/univamu/progav/td7/IntervalSequences.java
new file mode 100644
index 0000000..52d0127
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td7/IntervalSequences.java
@@ -0,0 +1,22 @@
+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;
+  }
+
+
+}
diff --git a/src/main/java/fr/univamu/progav/td7/Sequence.java b/src/main/java/fr/univamu/progav/td7/Sequence.java
new file mode 100644
index 0000000..41f5e32
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td7/Sequence.java
@@ -0,0 +1,14 @@
+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);
+}
diff --git a/src/main/java/fr/univamu/progav/td7/TD7.md b/src/main/java/fr/univamu/progav/td7/TD7.md
new file mode 100644
index 0000000..7073462
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td7/TD7.md
@@ -0,0 +1,69 @@
+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```.
+
+
diff --git a/src/test/java/fr/univamu/progav/td7/IntervalSequencesTest.java b/src/test/java/fr/univamu/progav/td7/IntervalSequencesTest.java
new file mode 100644
index 0000000..19dec96
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td7/IntervalSequencesTest.java
@@ -0,0 +1,44 @@
+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
diff --git a/src/test/java/fr/univamu/progav/td7/IntervalTest.java b/src/test/java/fr/univamu/progav/td7/IntervalTest.java
new file mode 100644
index 0000000..75efaa7
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td7/IntervalTest.java
@@ -0,0 +1,79 @@
+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
diff --git a/src/test/java/fr/univamu/progav/td7/ListSequence.java b/src/test/java/fr/univamu/progav/td7/ListSequence.java
new file mode 100644
index 0000000..4d048d9
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td7/ListSequence.java
@@ -0,0 +1,37 @@
+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);
+  }
+}
+
-- 
GitLab