Guava – Collections

Guava est un ensemble de bibliothèques destiné aux projets Java.
Elle est téléchargeable à cette adresse : code.google.com/p/guava-libraries/

Guava est proposé par Google, et avant tout utilisé par Google.

Elle inclut notamment :

  • Classes utilitaires pour la gestion des String
  • Nouveaux types de Collections
  • Gestion des caches
  • Entrées/Sorties
  • Réflection
  • Concurrence
  • Etc.

On évoquera ici les nouvelles collections.

BiMap

Une Map permet de retrouver une valeur à partir d’une clé.
Une BiMap permet, en plus, de retrouver une clé à partir d’une valeur.

L’intérêt : éviter d’avoir deux Maps, donc les risques de dé-synchronisation.
La BiMap possède la méthode inverse(), qui permet de « retourner » les paires clé/valeur.

Toute valeur devient donc une clé.

=> On ne peut pas insérer une paire clé/valeur, si la valeur est déjà présente en base.
C’est le comportement par défaut.
La méthode forcePut() permet d’écraser toute éventuelle paire pré-existante ayant cette valeur.

Table

Le principe de la Table est simple : retrouver une valeur à partir de deux clés.
Exemple ? Stocker des objets Personne, avec comme clé 1 = Nom, clé 2 = Prénom.

Une représentation graphique possible est la suivante :
|_|a|b|c|
|1|X|Y|Z|
|2|Y|Z|X|
|3|Z|X|Y|

On peut ainsi récupérer la valeur (a,1) = X.

Par ailleurs, il est possible de retrouver :
– toutes les valeurs associées à la clé (colonne) ‘a’,
– toutes les valeurs associées à la clé (ligne) ‘1’.

Note personnelle #1 : Pour identifier des Personnes, l’identifiant de personne physique reste la meilleure option (également appelée numéro de sécurité sociale 😉 ).

ClassToInstanceMap

On souhaite stocker, dans une même Map, des paires de clés/valeurs, avec des types différents pour la clé : String, Integer, etc..
La valeur entrée doit être du type spécifié en clé :
map.put(Integer.class, Integer.valueOf(5));
map.put(String.class, « Toto »);

MultiSet

Le Set permet de stocker des valeurs de façon unique, au sens d’equals.
Le MultiSet permet d’associer le nombre d’ajout effectués sur un élément.
Un compteur pouvant être utilisé, par exemple, pour compter les occurences de mots rencontrés dans un texte.
Le MultiSet sera également utile pour obtenir le nombre total de mots.

Il ne permet pas la gestion de l’ordre des éléments stockés.
Mais il existe le SortedMultiSet pour cela 😉

MultiMap

L’objectif est de stocker des paires <Object, Collection<T>>.
Exemple de cas d’utilisation : arbre orienté.
Pour représenter une famille, on pourrait ajouter une association Pierre (le père) -> Paul (création de la paire), puis Pierre -> Jacques (ajout de Jacques à la valeur de type collection).

On obtiendrait : Pierre (le père) -> [Paul, Jacques].

Le choix est laissé au développeur de spécifier une valeur qui remplacera les valeurs existantes : méthode replaceValues().

On ajoute Marie(Mère) -> [Paul].
L’inversion (voir la classe utilitaire Multimaps), nous permettrait d’obtenir :

Paul -> Pierre (le père)
Paul -> Marie (la mère)
Jacques -> Pierre (le père)

Variantes :
– le TreeMultimap, qui permet de conserver l’ordre naturel (compareTo), ou l’ordre défini par un Comparator.
– le ListMultimap, qui permet l’ajout de plusieurs paires identiques clé/valeur. L’ordre d’insertion est conservé
– Le LinkedHashMultimap, qui interdit l’ajout de plusieurs paires clé/valeur, et qui permet de parcourir les valeurs d’une clé selon leur ordre d’insertion.

RangeSet

Le but est de manipuler un intervalle de nombres (Integer, par exemple).
Exemple d’intervalles :
(a..b) {x | a < x < b} open
[a..b] {x | a <= x <= b} closed
(a..b] {x | a < x <= b} openClosed
[a..b) {x | a <= x < b} closedOpen
(a..+infini) {x | x > a} greaterThan
[a..+infini) {x | x >= a} atLeast
(-infini..b) {x | x < b} lessThan
(-infini..b] {x | x <= b} atMost
(-infini..+infini)

Les possibilités sont les suivantes :
– Calculer les intersections entre plusieurs RangeSet,
– Obtenir des sous-ensembles à partir de seuils de valeurs,
– Déduire les valeurs complémentaires.

Note personnelle #2 : J’attends de trouver des exemples d’utilisation concrets…

RangeMap

Ici, le but est d’associer des clés et des valeurs, mais avec des clés représentant des ensembles de nombres (voir partie précédente).
Par exemple :
– Attribuer la valeur « Note » pour les valeurs de 0 à 20,
– Attribuer la valeur « Bien » pour les valeurs de 13 à 15 : on écrase la valeur « Note »,

On se retrouve avec un ensemble 0->13 (Note) 13->15(Bien) 16->20(Note).
On peut obtenir une intersection sur les valeurs en fournissant un objet Range.

Note personnelle #3 : voir note personnelle #2.

Publicités
Guava – Collections

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s