9
votes

Façon la plus compacte de comparer trois objets pour l'égalité à l'aide de Java?

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.

suppose que les objets sont tous de la même classe et ont correctement remplacé égale et HashCode méthodes. Une légère ride est cet objet c pourrait être null -Si c'est le cas que a et b doivent être différent les uns aux autres.

J'ai du code mais c'est un peu ouvrière pour mes goûts.


0 commentaires

6 Réponses :


4
votes

Vous pouvez abstrumer cette méthode dans une méthode des utilitaires comme: xxx

la méthode peut ne pas bien fonctionner pour de petits nombres (en raison de la surcharge de la création du fichier et le tableau VARARGS). Cependant, il augmente linéairement O (n) et pour les grandes valeurs, c'est mieux que la croissance quadratique d'un imbriqué .


1 commentaires

En tant que note latérale, assurez-vous que le hashcode () est cohérent avec des égaux (),



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

1 commentaires

! x &&! y est égal à ! (x || y) (peut vous enregistrer une frappe)



12
votes

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


10 commentaires

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 , il est ou . 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) . 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.



6
votes

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
}


1 commentaires

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é



-2
votes
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;
    }
}

1 commentaires

Comment se rapporte-t-il à la question?



0
votes

comme le common.lang3.bjectutils de Apache () est @depecated . Utilisez Objets.equaux (AOBJ, BOBJ) . La comparaison doit être faite avec && si vous voulez que tous les 3 objets soient les mêmes. Utilisez || si vous voulez qu'une seule combinaison de A & B, A & C ou B & C est la même. XXX


0 commentaires