2009-11-16 4 views
7

Quel est le code le plus compact pour comparer trois objets pour l'égalité (sémantique) en utilisant Java? J'ai une règle de gestion selon laquelle les objets doivent être uniques: A est différent de B, A est différent de C et B est différent de C.Le moyen le plus compact de comparer trois objets pour l'égalité en utilisant Java?

Supposons que les objets sont tous de la même classe et ont été correctement remplacés Méthodes equals et hashCode. Un léger pli est que l'objet C pourrait être null — si tel est le cas, alors A et B doivent être différents les uns des autres.

J'ai du code mais c'est un peu un homme de métier à mon goût.

Répondre

11

Comme l'OP dit A et B ne sont jamais nuls, C peut être NULL, utilisez ceci:

if(A.equals(B) || B.equals(C) || A.equals(C)) 
    // not unique 

et, comme d'autres l'ont déjà suggéré, vous pouvez le mettre dans une méthode de réutilisation . Ou une méthode générique si vous avez besoin de plus réutiliser ;-)

Notez que Java, une caractéristique de equals est que si son argument est null il ne faut pas jeter, mais return false.

+1

Vous n'avez pas besoin du dernier terme; si A est égal à B et B égal à C, alors A doit être égal à C (ou l'implémentation de equals() est boguée). –

+3

@Aaron: ce n'est pas 'and', c'est' ou'. Si un terme est faux, l'autre terme peut toujours être vrai: 'Auto.equals (Bike) ou Bike.equals (Car) ou Auto.equals (Car)'. Les deux premiers sont faux, le troisième est vrai: c'est nécessaire ;-) – Abel

+1

Que faire si A! = B et C == null? Ma lecture de la question est que ceux-ci sont uniques, mais votre première réponse teste C d'abord et renvoie "non unique". – Nefrubyr

4

Vous pouvez abstraite cette méthode dans une méthode utilitaires comme:

public boolean allUnique(Object... objs) { 
    Set<Object> set = new HashSet<Object>(); 
    for (Object o : objs) 
    set.add(o); 
    return set.size() == objs.length 
} 

La méthode peut ne pas fonctionner correctement pour un petit nombre (en raison de la surcharge de la création de la Set et le tableau varargs). Cependant, il se développe linéairement O(n), et pour les grandes valeurs, il est meilleur que la croissance quadratique d'un instructions imbriquées.

+2

Comme une note de côté, assurez-vous que le hashCode() est compatible avec equals(), – James

4
boolean areDistinct(Object a, Object b, Object c) { 
    return (!a.equals(b) && 
      (c == null || (!c.equals(a) && !c.equals(b)))); 
} 
+0

Mettre cela en sa propre méthode de réutilisation obtient le upvote. –

+0

'! X &&! Y' est égal à'! (X || y) '(peut vous éviter de taper quelque chose) – Abel

6

Depuis que je ne commence jamais un projet Java sans utiliser Apache commons-lang, essayez ObjectUtils.equals (il est sûr null):

if (ObjectUtils.equals(a, b) || ObjectUtils.equals(b, c) || ObjectUtils.equals(a, c)) { 
    // error condition 
} 

Mettez cette logique dans une méthode générique, et vous allez faire encore mieux. Alors que la logique métier permet à C d'être nul, dans des scénarios comme celui-ci, il est souvent préférable de coder de manière défensive et de supposer que A ou B peut également être nul.

+1

Je ne connaissais pas ObjectUtils - merci! –

+1

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é –

+0

Don, je suis d'accord avec ça. –

-2
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; 
    } 
} 
+0

Comment cela se rapporte-t-il à la question? – Abel

Questions connexes