由于我不想进入的原因,我有一堆并行数组,我很好奇最优雅的方法是确保它们的长度都相同。 (如果其中一个长度错误,则必须缺少数据并且数组不能正确对齐)。
我不喜欢这样做的想法......
if(array1.length != array2.length || array1.length != array3.length etc...)
这看起来很可怕,我真的希望有一种更优雅的方式...
我的冲动是将它们的长度加在一起并除以数组的总数,看看这个数字是否与数组长度相同,但我愿意接受建议(以及被告知我的数据)由于某些我忽略的原因,这个想法是行不通的。
我是Java,但我怀疑这个问题的答案是语言不可知的。
答案 0 :(得分:6)
您可以编写这样的方法(使用java.lang.reflect.Array
):
import java.lang.reflect.Array;
/**
* Checks an arbitrary number of parallel arrays to verify that they have the same length.
* @throws IllegalArgumentException if any of the arguments is not an array or if the lengths of the arrays are not equal.
*/
public static void checkParallelArrays(Object... arrays) {
if (arrays.length < 1) {
return;
}
int expectedLength = Array.getLength(arrays[0]);
for (int i=1; i<arrays.length; i++) {
int length = Array.getLength(arrays[i]);
if (length != expectedLength) {
throw new IllegalArgumentException("Array " + i + " doesn't have expected length " + expectedLength + ": " + length);
}
}
}
请注意,参数类型为Object
,以允许原始数组(int[]
,char[]
,...)。如果您可以将参数限制为仅引用类型数组,那么这将简化代码。
答案 1 :(得分:2)
boolean checkLength(Collection myArrayCollection){
Iterator myIterator = myArrayCollection.iterator();
Object o = myIterator.next();
int length = (Object[])o.length;
while(myIterator.hasNext()){
o = myIterator.next();
if(length!= (Object[])o.length)
return false;
}
return true;
}
当然,可能存在语法错误(在尝试获取长度之前可能必须转换为Object []),以及一些语义错误(如捕获转换异常)。但是你明白了。
答案 2 :(得分:2)
Joachim代码的简单变体:
public static boolean areSameLength(Object[]... arrays) {
int N = arrays[0].length;
for (Object[] a : arrays)
if (a.length != N)
return false;
return true;
}
答案 3 :(得分:0)
我认为解决方案是检查所有数组的长度属性,看看它们是否完全相同。假设数组是String s [],Object s2 [],int [] s3,只需使用s.length == s1.length等等。