我正在为类分配编写程序,我想比较数组中的多个项目以获得等价。我的陈述基本上是这样的:
if (a == b && b == c && c == d && d == e && e == f) {
// do stuff
}
这种情况看起来非常冗长,我想知道是否有更短的方式来写这个。
答案 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。IntPredicate
为i -> (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]));
}
这取决于是否应该返回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])));
}
几乎可以肯定,只有在性能非常关键的应用程序中才需要额外的开销,如果你的方法被执行了很多次,你需要小心。