Quel est le code le plus compact pour comparer trois objets pour l'égalité (sémantique) à l'aide de Java? J'ai une règle d'entreprise que les objets doivent être uniques, c'est-à-dire I.e. A est différent de B, A est différent de c et b est différent de c. Em> p> p>
suppose que les objets sont tous de la même classe et ont correctement remplacé J'ai du code mais c'est un peu ouvrière pour mes goûts. P> égale code> et
HashCode code> méthodes. Une légère ride est cet objet c em> pourrait être
null code> -Si c'est le cas que a em> et b em> doivent être différent les uns aux autres. p>
6 Réponses :
Vous pouvez abstrumer cette méthode dans une méthode des utilitaires comme: la méthode peut ne pas bien fonctionner pour de petits nombres (en raison de la surcharge de la création du fichier code> et le tableau VARARGS). Cependant, il augmente linéairement O (n) code> et pour les grandes valeurs, c'est mieux que la croissance quadratique d'un
imbriqué code>. P> p>
En tant que note latérale, assurez-vous que le hashcode () est cohérent avec des égaux (),
boolean areDistinct(Object a, Object b, Object c) { return (!a.equals(b) && (c == null || (!c.equals(a) && !c.equals(b)))); }
! x &&! y code> est égal à
! (x || y) code> (peut vous enregistrer une frappe)
Comme l'op de l'OP dit A code> et
B code> ne sont jamais nuls,
c code> peut être null, utilisez ceci:
if(A.equals(B) || B.equals(C) || A.equals(C))
// not unique
Vous n'avez pas besoin du dernier terme; Si un équivaut à B et B est égal à C, alors un C doit être égal à C (ou la mise en œuvre d'égaux () est une buggy).
@Aaron: Ce n'est pas et code>, il est
ou code>. Si un terme est faux, l'autre terme peut toujours être vrai:
auto.equals (vélo) ou vélo.equaux (voiture) ou auto.equals (voiture) code>. Les deux premiers sont faux, troisième est vrai: c'est nécessaire ;-)
Et si A! = B et C == null? Ma lecture de la question est que celles-ci sont uniques, mais votre première réponse teste C première et retourne "pas unique".
+1 Bonne lecture de la question, je ne peux pas dire si c'est vrai ou non. Ma pensée était, au début, NULL est illégale et si oui, devrait être jetée. La deuxième solution, plus courte, traite correctement de votre scénario. Bien taché!
A! = B et C == NULL est un scénario valide.
Merci John pour élaborer, j'ai enlevé cette partie de la réponse.
Merci pour votre réponse. Hmm, il semble un peu évident maintenant que je le vois écrire comme ça!
Penser aux autos, les vélos et les voitures m'a aidé. Quand au milieu de quelque chose, vous ne pouvez pas toujours voir la forêt pour les arbres :).
D'accord. J'aurais pu nouer et souligné qu'une voiture est une sorte d'auto! ;-)
C'était l'idée: voiture == auto, par conséquent, la série n'est pas unique: la déclaration dans la réponse serait vraie.
Puisque je ne démarre jamais un projet Java sans utiliser Apache Commons-Lang , essayez Objecutils.equals Code> (c'est NULL SAFE):
if (ObjectUtils.equals(a, b) || ObjectUtils.equals(b, c) || ObjectUtils.equals(a, c)) {
// error condition
}
Mettre la logique dans une méthode Varargs semble plus utile qu'une méthode générique. Une méthode Varargs devrait vous permettre de comparer n'importe quel nombre d'objets pour l'égalité
package com.test; public class Equality { public static void main(String[] args) { Boolean flag; int[] arr={1,1,1,12}; flag=check_equal(arr); System.out.println(flag); } public static Boolean check_equal(int[] arr){ Boolean flag=true; outerloop: for(int i=1; i< arr.length; i++) { for(int j=1; j< arr.length; j++){ if(arr[i]==arr[j]){ flag=true; } else{ flag=false; break outerloop; } } } return flag; } }
Comment se rapporte-t-il à la question?
comme le common.lang3.bjectutils de Apache () code> est
@depecated code>. Utilisez
Objets.equaux (AOBJ, BOBJ) CODE>. La comparaison doit être faite avec
&& code> si vous voulez que tous les 3 objets soient les mêmes. Utilisez
|| code> si vous voulez qu'une seule combinaison de