我正在为一个类赋值编写一个程序,我想要比较数组中的多个项是否相等。我的声明基本上是这样的:
if (a == b && b == c && c == d && d == e && e == f) {
// do stuff
}这个条件看起来非常冗长,我想知道是否有更短的方法来编写它。
发布于 2014-03-04 23:01:41
这可能看起来很冗长,但至少它是相当有效和清晰的。
不要为了简洁性而优化代码。
您可以很容易地创建一个helper函数
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。
发布于 2014-03-04 23:56:01
我的建议是创建一个集合,如果它的大小是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发布于 2014-03-04 23:36:11
假设您已经有了一个数组,这可以在Java 8中完成以下操作:
int[] numbers = {1, 2, 3, 4, 5};
if (Arrays.stream(numbers).allMatch(i -> (i == numbers[0]))) {
//they are equal
}它的作用是:
它将数组封装在一个IntStream中(除了在IntStream)
IntPredicate is i -> (i == numbers[0]),它将i映射到建议将其封装在一个helper方法中,如果数组为空,您可能希望提早保释,如下所示:
public static boolean allEquals(final int[] input) {
return (input.length > 0 && Arrays.stream(input).allMatch(i -> i == input[0]));
}这取决于如果没有输入,它应该返回true还是false……那么一切都是平等的吗?
请注意,您需要为您正在使用的所有原语编写此代码。另外,您还可以提供一个通用版本:
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])));
}你几乎肯定可以忍受额外的开销,只有在对性能非常关键的应用程序中,如果你的方法被执行了很多次,你需要小心。
https://stackoverflow.com/questions/22175335
复制相似问题