最简洁的方法是使用Java比较三个对象是否相等?

时间:2009-11-16 15:46:41

标签: java equals

使用Java比较三个对象(语义)相等的最紧凑的代码是什么?我有一个业务规则,即对象必须是唯一的,即A 与B不同,A与C不同,B与C不同。

假设这些对象都属于同一个类,并且已正确覆盖equalshashCode方法。一个轻微的皱纹是对象 C 可能是null - 如果是这种情况,那么 A B 必须与彼此。

我有一些代码但是我的口味有点像工作人员。

6 个答案:

答案 0 :(得分:11)

由于OP说AB永远不会为空,C可能为空,请使用:

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

并且,正如其他人已经建议的那样,您可以将其置于重用方法中。或者如果您需要更多重用,则使用通用方法; - )

请注意,在Java中,equals的一个特性是,如果它的参数是null,它不应该抛出,而是返回false。

答案 1 :(得分:6)

由于我从未在不使用Apache commons-lang的情况下启动Java项目,请尝试ObjectUtils.equals(它是空的安全):

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

将该逻辑放在通用方法中,你会做得更好。

虽然业务逻辑允许C为null,但在这种情况下,通常更好地进行防御性编码并假设A或B也可以为空。

答案 2 :(得分:4)

您可以在以下实用程序方法中抽象该方法:

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语句的二次增长。

答案 3 :(得分:4)

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

答案 4 :(得分:0)

因为apache的common.lang3.ObjectUtils.equals()@Deprecated。使用Objects.equals(aObj,bObj)。如果您希望所有3个对象都相同,则应与&&进行比较。如果您只希望 a&b,a&c或b&c 的一个组合相同,请使用||

/**
 * Compare 3 objects of the same {@link TYPE}, if they are all equal using {@link Objects#equals(Object, Object)}.
 * 
 * @param aObj the 1st object
 * @param bObj the 2nd object
 * @param cObj the 3th object
 * @param <TYPE> the type of the objects
 * @return true if the are all the same
 */
public static <TYPE> boolean equals(TYPE aObj, TYPE bObj, TYPE cObj) {
    return Objects.equals(aObj, bObj) && Objects.equals(bObj, cObj) && Objects.equals(cObj, aObj);
}

答案 5 :(得分:-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;
    }
}