2009-11-16 7 views
7

Was ist der kompakteste Code, um drei Objekte für (semantische) Gleichheit mit Java zu vergleichen? Ich habe eine Geschäftsregel, dass die Objekte eindeutig sein müssen, dh A ist anders als B, A ist anders als C und B ist anders als C.Die kompakteste Möglichkeit, drei Objekte mithilfe von Java auf Gleichheit zu prüfen.

Angenommen, dass die Objekte alle der gleichen Klasse sind und ordnungsgemäß überschrieben haben equals und hashCode Methoden. Eine leichte Falte ist, dass Objekt Cnull — sein könnte, wenn dies der Fall ist, dann A und B zueinander unterschiedlich zu sein haben.

Ich habe ein wenig Code, aber es ist ein bisschen handwerklich für meinen Geschmack.

Antwort

11

Als OP sagte A und B nie null sind, C null sein kann, verwenden Sie diese:

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

und, wie andere haben bereits angedeutet, können Sie es in einem Verfahren zur Wiederverwendung setzen können . Oder eine generische Methode, wenn Sie mehr Wiederverwendung brauchen ;-)

Beachten Sie, dass in Java ein Feature von equals ist, dass, wenn sein Argument null es nicht werfen, aber false zurückgeben soll.

+1

Sie brauchen den letzten Ausdruck nicht; Wenn A gleich B ist und B gleich C ist, dann muss A gleich C sein (oder die Implementierung von equals() ist fehlerhaft). –

+3

@Aaron: Es ist nicht "und", es ist "oder". Wenn ein Begriff falsch ist, kann der andere Ausdruck immer noch wahr sein: 'Auto.equals (Fahrrad) oder Bike.equals (Auto) oder Auto.equals (Auto)'. Die ersten beiden sind falsch, das dritte ist wahr: es wird benötigt ;-) – Abel

+1

Was ist, wenn A! = B und C == null? Meine Lektüre der Frage ist, dass diese einzigartig sind, aber Ihre erste Antwort testet C zuerst und gibt "nicht einzigartig" zurück. – Nefrubyr

4

Sie abstrahieren kann diese Methode in einem Verfahren Dienstprogramme wie:

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

Verfahren nicht gut für kleine Zahlen durchführen können (aufgrund der Overhead der Set schaffen und die varargs Array). Es wächst jedoch linear O(n), und für große Werte ist es besser als das quadratische Wachstum einer verschachtelten if Aussagen.

+2

Als Randbemerkung, stellen Sie sicher, dass der Hash-Code() mit equals konsistent ist(), – James

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

das Einlochen in seine eigene Methode zur Wiederverwendung der upvote wird. –

+0

'! X &&! Y' ist gleich'! (X || y) '(kann Ihnen Tippfehler ersparen) – Abel

6

Da ich nie ohne Apache commons-lang ein Java-Projekt starten, versuchen ObjectUtils.equals (es null ist sicher):

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

diese Logik in einem allgemeinen Verfahren Stoßen, und Sie werden noch besser machen.

Während die Geschäftslogik zulässt, dass C null ist, ist es in Szenarien wie diesen oft besser, defensiv zu codieren und anzunehmen, dass entweder A oder B auch null sein könnten.

+1

Ich wusste nichts über ObjectUtils - danke! –

+1

Das Einfügen der Logik in eine varargs-Methode scheint sinnvoller als eine generische Methode. Eine Varargs-Methode sollte es Ihnen ermöglichen, eine beliebige Anzahl von Objekten für die Gleichheit zu vergleichen. –

+0

Don, dem stimme ich zu. –

-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

Wie hängt das mit der Frage zusammen? – Abel

Verwandte Themen