2011-08-31 4 views
7

Java a un Comparator<T> pour fournir la comparaison des objets externes à la classe elle-même, pour permettre des méthodes multiples/alternatives de faire ordonnées comparaisons.Java: classe externe pour déterminer l'équivalence?

Mais la seule façon standard de faire des comparaisons désordonnées est de passer outre equals()au sein une classe.

Que dois-je faire lorsque je souhaite fournir des comparaisons multiples/alternatives non ordonnées externes à une classe? (cas d'utilisation Obvious est le partitionnement d'une collection en classes d'équivalence en fonction des propriétés particulières.)

En supposant l'utilisation finale est pour le contrôle non ordonnée (par exemple, pas pour le tri ou l'indexation), est-il toujours OK pour mettre en œuvre Comparator<T> qui vérifie juste pour égalité, renvoyant 0 si deux objets sont égaux, et une valeur! = 0 lorsque deux objets sont inégaux? (note:. La seule raison pour laquelle je ne saute pas sur cette solution, est que, techniquement, il peut rompre le contrat pour Comparator en ne fournissant pas une relation qui satisfait transitivité et de symétrie)

Il semble qu'il y aurait dû y avoir une classe standard EqualsComparator<T> ou quelque chose.

(Est-Goyave gérer quelque chose comme ça?)

Répondre

13

Oui, Guava a l'interface Equivalence et la Equivalences classe (Suppression de goyave libérer 14,0).

(Et oui, c'est quelque chose qui est très utile et, malheureusement, manque de Java. Nous devrions vraiment avoir des options pour contourner ce HashMap, HashSet etc ...)

Alors que Comparator<T>peut être bien dans Dans certaines situations, il ne fournit pas la méthode hashCode qui serait importante pour les collections basées sur le hachage.

+0

hmmm ... les deux sont tagués @Beta. –

+0

@Jason: Alors utilisez avec précaution :) (En fin de compte 'Equivalence' est une interface, donc ce n'est pas comme si vous comptez sur une * implémentation * qui pourrait disparaître.) –

+5

Je peux promettre que ça ne partira pas, mais c'est en mouvement. Par exemple, pour la version 10.0 imminente, nous l'avons transformée en classe abstraite et y avons directement déplacé la plupart des Equivalences (et finirons probablement le travail à un moment donné). –

Questions connexes