首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更有效的方法来比较If语句中的3+项?

有没有更有效的方法来比较If语句中的3+项?
EN

Stack Overflow用户
提问于 2014-03-04 22:56:14
回答 3查看 2.4K关注 0票数 4

我正在为一个类赋值编写一个程序,我想要比较数组中的多个项是否相等。我的声明基本上是这样的:

代码语言:javascript
复制
if (a == b && b == c && c == d && d == e && e == f) {
   // do stuff
}

这个条件看起来非常冗长,我想知道是否有更短的方法来编写它。

EN

回答 3

Stack Overflow用户

发布于 2014-03-04 23:01:41

这可能看起来很冗长,但至少它是相当有效和清晰的。

不要为了简洁性而优化代码。

您可以很容易地创建一个helper函数

代码语言:javascript
复制
boolean allEqual(Object ... objs) {
    for(int i = 1; i < obj.length; i++) {
      if (!objs[i].equals(objs[0])) {
        return false;
      }
    }
    return true;
}

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

代码语言:javascript
复制
if (allEqual(1.1,2.1,3.1,4.1))

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

确保你真的想要==而不是equals

票数 3
EN

Stack Overflow用户

发布于 2014-03-04 23:56:01

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

代码语言:javascript
复制
public static < E > boolean areAllEqual( E[] inputArray ){
    Set<E> mySet = new HashSet<E>(Arrays.asList(inputArray));
    return mySet.size() == 1;
}    

下面是完整的代码示例:

代码语言:javascript
复制
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");                            
     }
}

输出:

代码语言:javascript
复制
It should work
inarray No
doubleArray No
charArray  Yes  // all elements in char array are eq
票数 3
EN

Stack Overflow用户

发布于 2014-03-04 23:36:11

假设您已经有了一个数组,这可以在Java 8中完成以下操作:

代码语言:javascript
复制
int[] numbers = {1, 2, 3, 4, 5};
if (Arrays.stream(numbers).allMatch(i -> (i == numbers[0]))) {
    //they are equal
}

它的作用是:

它将数组封装在一个IntStream中(除了在IntStream)

  • It上检查所有对象是否都返回true之外,它不会创建额外的对象) IntPredicate is i -> (i == numbers[0]),它将i映射到

建议将其封装在一个helper方法中,如果数组为空,您可能希望提早保释,如下所示:

代码语言:javascript
复制
public static boolean allEquals(final int[] input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i == input[0]));
}

这取决于如果没有输入,它应该返回true还是false……那么一切都是平等的吗?

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

代码语言:javascript
复制
public static <T> boolean allEquals(final T[] input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i.equals(input[0])));
}

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

代码语言:javascript
复制
public static <T> boolean allEquals(final T... input) {
    return (input.length > 0 && Arrays.stream(input).allMatch(i -> i.equals(input[0])));
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22175335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档