Pour répondre à la question précise " Pourquoi ne Set
fournir une opération permettant d'obtenir un élément égal à un autre élément ?", la réponse serait : parce que les concepteurs du cadre de collecte n'étaient pas très prévoyants. Ils n'ont pas anticipé votre cas d'utilisation très légitime, ont naïvement essayé de "modéliser l'abstraction des ensembles mathématiques" (d'après la javadoc) et ont tout simplement oublié d'ajouter l'élément utile get()
méthode.
Passons maintenant à la question implicite " comment Vous obtenez l'élément alors" : Je pense que la meilleure solution est d'utiliser un Map<E,E>
au lieu d'un Set<E>
pour faire correspondre les éléments entre eux. De cette manière, vous pouvez efficacement récupérer un élément de l'"ensemble", car la méthode get() de l'élément Map
trouvera l'élément à l'aide d'une table de hachage efficace ou d'un algorithme d'arbre. Si vous le souhaitez, vous pouvez écrire votre propre implémentation de Set
qui offre l'avantage supplémentaire de get()
en encapsulant la méthode Map
.
Les réponses suivantes sont à mon avis mauvaises ou erronées :
"Vous n'avez pas besoin d'obtenir l'élément, car vous avez déjà un objet égal" : l'affirmation est fausse, comme vous l'avez déjà montré dans la question. Deux objets qui sont égaux peuvent toujours avoir un état différent qui n'est pas pertinent pour l'égalité de l'objet. Le but est d'accéder à cet état de l'élément contenu dans l'objet Set
et non l'état de l'objet utilisé comme "requête".
"Vous n'avez pas d'autre option que d'utiliser l'itérateur" : il s'agit d'une recherche linéaire sur une collection, ce qui est totalement inefficace pour les grands ensembles (ironiquement, en interne, la fonction Set
est organisé sous la forme d'une carte de hachage ou d'un arbre qui peut être interrogé efficacement). Ne le faites pas ! J'ai constaté de graves problèmes de performance dans des systèmes réels en utilisant cette approche. À mon avis, ce qui est terrible à propos de l'absence de get()
n'est pas tant qu'il est un peu lourd de le contourner, mais que la plupart des programmeurs utiliseront l'approche de la recherche linéaire sans penser aux implications.
2 votes
Ce sujet a déjà été largement débattu et de bonnes réponses ont été proposées. Cependant, si vous cherchez simplement un ensemble ordonné, utilisez simplement
SortedSet
et ses implémentations, qui sont basées sur des cartes (par ex.TreeSet
permet d'accéderfirst()
).3 votes
Cette méthode me manque aussi, pour exactement le même cas que celui que vous avez décrit ci-dessus. Objective-C (
NSSet
) dispose d'une telle méthode. Elle s'appellemember
et renvoie l'objet de l'ensemble qui est "égal" au paramètre de la fonctionmember
(qui peut bien sûr être un objet différent et avoir des propriétés différentes, que equal ne peut pas vérifier).