是否有更有效的方法来比较If语句中的3个以上的项目?

时间:2014-03-04 14:56:14

标签: java if-statement conditional-statements

我正在为类分配编写程序,我想比较数组中的多个项目以获得等价。我的陈述基本上是这样的:

if (a == b && b == c && c == d && d == e && e == f) {
   // do stuff
}

这种情况看起来非常冗长,我想知道是否有更短的方式来写这个。

3 个答案:

答案 0 :(得分:3)

这似乎是详细,但至少它相当有效且清除

为简洁起见,请不要过度使用优化代码。

您可以轻松制作辅助功能

boolean allEqual(Object ... objs) {
    for(int i = 1; i < obj.length; i++) {
      if (!objs[i].equals(objs[0])) {
        return false;
      }
    }
    return true;
}

但这将创造额外的对象;特别是原始值:

if (allEqual(1.1,2.1,3.1,4.1))

将创建5个对象,需要进行垃圾回收。

确保您确实需要==而不是equals

答案 1 :(得分:3)

我的建议是创建一个集合,如果它的大小为1,则所有元素都相等,否则不是:

public static < E > boolean areAllEqual( E[] inputArray ){
    Set<E> mySet = new HashSet<E>(Arrays.asList(inputArray));
    return mySet.size() == 1;
}    

以下是完整的代码示例:

import java.util.*;
public class HelloWorld{
    public static < E > boolean areAllEqual( E[] inputArray ){
        Set<E> mySet = new HashSet<E>(Arrays.asList(inputArray));
        return mySet.size() == 1;
    }    
     public static void main(String []args){
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'H', 'H', 'H', 'H' };

        System.out.println("It should work");
        if (areAllEqual(intArray))
            System.out.println("inarray Yes");
        else
            System.out.println("inarray No");

        if (areAllEqual(doubleArray))
            System.out.println("doubleArray Yes");
        else
            System.out.println("doubleArray No");

        if(areAllEqual(charArray))
            System.out.println("charArray  Yes");
        else
            System.out.println("charArray  No");                            
     }
}

输出:

It should work
inarray No
doubleArray No
charArray  Yes  // all elements in char array are eq

答案 2 :(得分:1)

这可以在Java 8中完成,因为你已经有了一个数组:

int[] numbers = {1, 2, 3, 4, 5};
if (Arrays.stream(numbers).allMatch(i -> (i == numbers[0]))) {
    //they are equal
}

它的作用是:

  • 它将您的数组封装在IntStream中(创建额外的对象,除了IntStream
  • 检查IntPredicate上是否所有对象都返回true。
  • IntPredicatei -> (i == numbers[0]),将i映射到(i == numbers[0])

建议将其封装在一个帮助器方法中,如果数组为空,你需要提前保释,如下所示:

public static boolean allEquals(final int[] input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i == input[0]));
}

这取决于是否应该返回truefalse如果没有输入......那么一切都相等吗?

请注意,您需要为正在使用的所有原语创建此代码。另外,您还可以提供通用版本:

public static <T> boolean allEquals(final T[] input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i.equals(input[0])));
}

现在当你没有合适的结构时,意味着它们很可能只是变量,那么将需要决定你是否需要额外的性能,或者可以忍受传递它们的开销在作为 varargs 输入中,隐含地创建了一个数组,其代码将非常相似:

public static <T> boolean allEquals(final T... input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i.equals(input[0])));
}

几乎可以肯定,只有在性能非常关键的应用程序中才需要额外的开销,如果你的方法被执行了很多次,你需要小心。