Самый компактный способ сравнить три объекта на равенство с помощью Java? - PullRequest
8 голосов
/ 16 ноября 2009

Какой самый компактный код для сравнения трех объектов на (семантическое) равенство с использованием Java? У меня есть бизнес-правило, согласно которому объекты должны быть уникальными, т. Е. A отличается от B, A отличается от C и B отличается от C.

Предположим, что все объекты относятся к одному классу и имеют корректно переопределенные методы equals и hashCode. Небольшая складка в том, что объект C может иметь значение null - в таком случае A и B должны отличаться друг от друга.

У меня есть код, но он немного похож на мой вкус.

Ответы [ 5 ]

11 голосов
/ 16 ноября 2009

Поскольку ОП говорит, что A и B никогда не равны нулю, C может быть нулевым, используйте это:

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

и, как уже предлагали другие, вы можете поместить его в метод для повторного использования. Или универсальный метод, если вам нужно больше повторного использования; -)

Обратите внимание, что в Java особенность equals состоит в том, что, если ее аргумент равен null, он не должен выдавать, а возвращать false.

6 голосов
/ 16 ноября 2009

Поскольку я никогда не запускаю проект Java без использования Apache commons-lang , попробуйте ObjectUtils.equals (это безопасно):

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

Поместите эту логику в общий метод, и у вас все получится еще лучше.

В то время как бизнес-логика позволяет C быть нулевым, в подобных сценариях часто лучше защищать код и предполагать, что либо A, либо B также могут быть нулевыми.

4 голосов
/ 16 ноября 2009
boolean areDistinct(Object a, Object b, Object c) {
    return (!a.equals(b) &&
            (c == null || (!c.equals(a) && !c.equals(b))));
}
4 голосов
/ 16 ноября 2009

Вы можете абстрагировать этот метод в методе утилит, например:

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

Метод может не работать хорошо для небольших чисел (из-за накладных расходов на создание Set и массива varargs). Однако он растет линейно O(n), а для больших значений он лучше, чем квадратичный рост вложенных if операторов.

0 голосов
/ 03 июля 2013
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;
    }
}
...