• Aucun résultat trouvé

Collections, Stream, Lambda & Calcul parallélisé

N/A
N/A
Protected

Academic year: 2022

Partager "Collections, Stream, Lambda & Calcul parallélisé"

Copied!
27
0
0

Texte intégral

(1)

Année académique 2020-2021

Collections, Stream, Lambda &

Calcul parallélisé

Ir Olivier DEBAUCHE

Prof Pierre Manneback

Adriano GUTTADAURIA

(2)

Les listes: class LinkedList Les vecteurs: class ArrayList

Les queues: interface Queue (FiFo)

Les queues à double entrée: interface Deque (LiFo) Les ensembles organisés par hachage: class HashSet Les ensembles organisés en arbre binaire: class TreeSet Table de hachage: classe HashMap

Arbre binaire: classe TreeMap

Collections

(3)

En C++

#include<list>

#include<string>

list<string> ma_liste;

list<string>::iterator it;

for (it = ma_liste.begin(); it !=

ma_liste.end(); it++) { … }

Collections (LinkedList)

En Java

import java.util.*;

LinkedList<String> ma_liste = new LinkedList<String>();

ListIterator<String> it = ma_liste.listIterator();

while (it.hasNext()) {

… }

(4)

En C++

for (it=ma_liste.end();

it!=ma_liste.begin(); it--) { … }

it++;

it--;

Collections : remarques

En Java while(it.previous()) {

… }

it.next();

it.previous();

(5)

En C++

#include<list>

#include<string>

vector<string> mon_vec;

vector<string>::iterator it;

for (it = mon_vec.begin(); it !=

mon_vec.end(); it++) { … }

Collections (ArrayList)

En Java

import java.util.*;

ArrayList<String> mon_vec = new ArrayList<String>();

for(int i=0; i<mon_vec.size();

i++) { … }

(6)

Collections (Piles et Files)

Queue

.add() ajoute un élément.

.poll() prélève et supprime l’élément de la queue.

.peek() prélève sans supprimer un élément de la queue.

Note: LinkedList implémente Queue.

Deque

.addFirst(e) ajoute un élément en début de file.

.addLast(e) ajoute un élément en fin de file.

.pollFirst() prélève un supprime un élément au début.

.pollLast() prélève un supprime un élément à la fin.

.peekFirst() prélève un élément au début de la file.

.peekLast() prélève un élément à la fin de la file.

Note: LinkedList implémente

Deque.

(7)

HashSet

Nécessite la définition des méthodes hashCode() et equals() dans la classe

Mais nécessite la connaissance statistique des données pour choisir un algorithme de

hashCode.

Collections (Les ensembles)

TreeSet

Nécessite l’implémentation de l’interface Comparable et la définition de la méthode compareTo.

Effectue un tri complet des données.

Un ensemble contient des valeurs uniques

(8)

HashSet (Exemple)

Import java.util.*;

public class hashsetdemo {

public static main(String args[]) {

Animal a1 = new Animal(‘’Cochon’’, 120);

Animal a2 = new Animal(‘’Martre’’, 1.3);

Animal a3 = new Animal(‘’Oiseau’’, 0.3);

HashSet<Animal> ens = new HashSet<Animal>();

ens.add(a1); ens.add(a2); ens.add(a3);

affiche(ens);

}

public static void affiche (HashSet<Animal> ens) { Iterator<Animal> it = ens.iterator();

while (it.hasNext()) { Animal a = it.next();

a.affiche();

} } }

Collections (Les ensembles)

class Animal {

private String nom;

private float poids;

Animal (String nom, float poids) { this.nom = nom;

this.poids = poids;

}

public int hashCode() {

return nom.length() + poids;

}

public booleanequals(Object ani) { Animal a = (Animal) ani;

return ((this.nom == a.nom) & (this.poids = a.poids) ;

}

public void affiche() {

System.out.print(‘’[‘’ + nom + ‘’ ‘’ + poids + ‘’]’’);

} }

(9)

TreeSet (Exemple)

Import java.util.*;

public class treesetdemo {

public static main(String args[]) {

Animal a1 = new Animal(‘’Cochon’’, 120);

Animal a2 = new Animal(‘’Martre’’, 1.3);

Animal a3 = new Animal(‘’Oiseau’’, 0.3);

TreeSet<Animal> ens = new TreeSet<Animal>();

ens.add(a1); ens.add(a2); ens.add(a3);

affiche(ens);

}

public static void affiche (HashSet<Animal> ens) { Iterator<Animal> it = ens.iterator();

while (it.hasNext()) { Animal a = it.next();

a.affiche();

} } }

Collections (Les ensembles)

class Animal implements Comparable { private String nom;

private float poids;

Animal (String nom, float poids) { this.nom = nom;

this.poids = poids;

}

public int compareTo(Object ani) { Animal a = (Animal) ani;

if (this.nom < a.nom) return -1;

else if (this.nom > a.nom) return 1;

else if (this.poids < a.poids) return -1;

else if (this.poids > a.poids) return 1;

else return 0;

}

public void affiche() {

System.out.print(‘’[‘’ + nom + ‘’ ‘’ + poids + ‘’]’’);

} }

(10)

HashMap

HashMap<K,V> m = new HashMap<K,V>();

TreeMap

TreeMap<K,V> m = new TreeMap<K,V>();

Exemple:

HashMap<String,Int> m = new HashMap<String,Int>();

m.put(‘’c’’, 10); // Ajoute ou modifie un élément String ch = m.get(‘’c’’); // Récupère un élément

Collection <Int> = valeurs = m.values(); // Récupère les valeurs Set<String> cles = m.keySet(); Récupère les clés

m.remove(‘’c’’); // Supprime l’élément de clé ‘’c’’

Collections (Les tableaux associatifs)

HashMap = table de hachage / TreeMap = arbre binaire

(11)

Exemple (suite):

HashMap<String,Int> m = new HashMap<String,Int>();

Set<Map.Entry<String, Int>> entrees = m.entrySet();

Iterator<Map.Entry<String,Int>> it = entrees.iterator();

while (it.hasNext()) {

Map.Entry<String, Int> entree = it.next();

String valeur = entree.getValue();

if (valeur.equals(‘’20’’) {

System.out.println(‘’Trouvée à la clé: ‘’ + entree.getKey());

} }

Collections (Les tableaux associatifs)

HashMap = table de hachage / TreeMap = arbre binaire

(12)

Soit une collection c de type E: c<E>

(ex: LinkedList<float> ma_collection = new LinkedList(); ) 1. For Each

for (float o : ma_collection) {

}

2. Lambda (A privilégier)

ma_collection.forEach( ee -> {

});

Parcours d’une collection

(13)

Soit une collection c de type E: c<E>

(ex: LinkedList<float> ma_collection = new LinkedList(); ) 1. addAll (ca) : ajoute à la collection c tous les éléments de la

collection ca.

2. removeAll (ca) : supprime de la collection c tout élément apparaissant égal à un des éléments de la collection ca.

3. retainAll (ca) : supprime de la collection c tout élément qui n’apparaît pas égal à un des éléments de la collection ca. En d’autres termes, on ne conserve dans c que les éléments

présents dans ca.

Opérations collectives

(14)

Quelques méthodes utiles disponibles pour LinkedList et ArrayList

Ajouter un élément en position p: .add(p, elem);

Modifier un élément en position p: .set(p, elem);

Récupérer la valeur en position p: .get(p);

Supprimer en position p: .remove(p);

Première position d’un élément: .indexOf(elem);

Dernière position d’un élément: .lastIndexOf(elem);

Collections : Interface List

(15)

Syntaxe: liste d’arguments ->corps

Exemple: (x,y) -> x+y

Les flux (streams)

(16)

.stream() Permet de créer un flux séquentiel .parallelStream() Permet de créer un flux parallèle

. forEach() Itération à l’aide d’une lambda expression

. forEachOrdered() Itération ordonnée à l’aide d’une lambda expression

. filter() Filtre un flux

Exemples:

Integer tabObj[] = { 3, 8, 2, -4, 0, 12, 8, -5, 3, -4, 15};

List<Integer> liste = Arrays.asList(tabObj);

Stream, parallelStream, ForEach,

ForEachOrdered & Filter

(17)

--- Filtrage des valeurs > 0 avec une collection ---

liste.stream(). filter(ee -> ee> 0).forEach(ee -> System.out.print(ee + " " ));

3 8 2 12 8 3 15

--- Filtrage des >0 avec une collection, en parallèle ---

liste.parallelStream().filter(ee -> ee> 0).forEach(ee -> System.out.print(ee + " " ));

8 12 15 2 8 3 3

--- Filtrage des >0 avec une collection, en parallèle avec forEachOrdered ---

liste.parallelStream().filter(ee -> ee> 0).forEachOrdered(ee -> System.out.print(ee + " " ));

Stream, parallelStream, ForEach,

ForEachOrdered & Filter

(18)

.mapToInt() Transforme un flux en flux d’entiers .average() Calcule la moyenne

.orElse(0.0) Valeur par défaut à 0

.ifPresent() Permet d’exécuter une action si la valeur concernée est présente .findFirst() Trouver le premier élément

.sorted() Trie par ordre alphabétique .distinct() Supprime les doublons .getAsDouble() Converti en double .getAsInt() Converti en Integer

.count Compte le nombre d’éléments

Autres méthodes

(19)

.stream() (1)

.filter(entry -> entry.getValue().isPresent()) (2)

.sorted(Map.Entry.comparingByValue((o1, o2) -> -Integer.compare(o1.getAsInt(), o2.getAsInt()))) (3)

.limit(n) (4)

.map(Map.Entry::getKey) (5) .collect(Collectors.toList()); (6) 1 – Création du flux

2 – Filtrage des éléments pour lesquels une valeur est présente isPresent() 3 – Trie le flux par comparaison des valeurs entières des objets.

4 – Limite le flux à n éléments

5 – Remplace chacun des éléments par le résultat de l’accesseur getKey() 6 – Transformation du stream en collection

Autres exemples:

(20)

.stream() (1)

.filter(Personnage::isSuccessful) (2)

.sorted(Comparator.comparingDouble(personnage -> - personnage.averageScore())) (3)

.collect(Collectors.toList()); (4) 1 – Création du flux

2 – Filtrage des éléments en fonction de l’accesseur isSuccessfull

3 – Trie par ordre décroissant les éléments sur base de leur score moyen averageScore()

4 – Transformation du stream en collection

Autres exemples:

(21)

.stream() (1)

.flatMapToInt(student ->

eleve.getScoreByCourse().values().stream().mapToInt(Integer::intValue)) (2) .average() (3)

.orElse(0.0); (4)

1 – Création du flux

2 – Renvoi le résultat de la transformation Map sous forme de flux 3 – Calcule la moyenne

4 – Alternative en cas d’absence d’élément = 0

Autres exemples:

(22)

.stream() (1)

.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) (2) .map(Map.Entry::getKey) (3)

.findFirst(); (4)

1 – Création du flux

2 – Trie les flux par ordre décroissant

3 – Remplace chaque élément par le résultat de l’accesseur getKey 4 – Trouve le premier élément

Autres exemples:

(23)

Ecrire une fonction Lambda dans :

private static double lambda(List<? extends Employee> peoples){

Qui permet d’obtenir un résultat équivalent à celui produit par:

private static double calculateAverage(List<? extends Employee>

employees){

Exercice 1

(24)

Remplacer par son equivalent stream les fonctions:

• averageScore()

• bestCourse()

• bestScore()

• failedCourses()

de la classe Student.java

Exercice 2

(25)

Remplacer par son equivalent stream dans les fonctions de la classe Classroom.java:

public List<Student> successfulStudents() {

List<Student> studentList = new ArrayList<>();

for (Student s : studentSet) studentList.add(s);

return studentList;

Exercice 3

(26)

Remplacer par son equivalent stream dans les fonctions de la classe Classroom.java:

public double averageScore() { double sum = 0;

int cpt = 0;

for (Student student : students) {

for (Map.Entry<String, Integer> courses :

student.getScoreByCourse().entrySet()) { sum += courses.getValue();

cpt++;

} }

return (sum / cpt);

Exercice 3

(27)

Parallélisez le code suivant:

Map<String, Long> words =

stream.flatMap(line -> Arrays.stream(line.split(regex))) // découpe en utilisant une regex pour trouver les séparateurs

.filter(line -> Optional.ofNullable(line).orElse("").length() != 0) // enlève les lignes vides

.filter(word -> word.length() >= 6 && word.length() <= 12) // garde uniquement les mots d'une longueur de 6 à 12 lettres

.map(String::toLowerCase) // les mets tous en minuscule

.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); //

rassemble dans la map les mots en comptant le nombre d'occurences

Exercice 4

Références

Documents relatifs

Hervé ARBOUSSET Maître de conférences en droit - HDR Directeur du CERDACC - EA 3992.

Toute recherche de données est basée sur la même fonction dont le nombre d'adresses possibles est constant. Toute collision conduit à la création d'un débordement 

Théorème : Si les éléments de table [1 … n] et x sont choisis uniformément dans un intervalle [a,b], le temps moyen.. d’exécution de la recherche par interpolation est O (log

Le hachage à la sortie du silo de deux ensilages à brins longs a aussi permis une augmen- tation des quantités ingérées, quoique dans une proportion plus faible ;

Cette clé primaire préliminaire est générée à partir des données échangées depuis le début du hanshake, chiffrée avec la clé publique du serveur (trouvée dans son

– Cette clé primaire préliminaire est générée à partir des données échangées depuis le début du hanshake, chiffrée avec la clé publique du serveur (trouvée dans

suppression avec adressage ouvert : tr`es difficile utiliser lazy deletion : marquer la case «supprim´ee».. ⇒ facteur de remplissage inclut les

En PostgreSQL, on peut choisir le type d’index utilisé dans un CREATE INDEX avec USING method entre le nom de la table et la liste des colonnes, method pouvant être btree (arbre B,