确保多个数组长度相同的最佳方法

时间:2011-10-20 07:57:25

标签: java arrays

由于我不想进入的原因,我有一堆并行数组,我很好奇最优雅的方法是确保它们的长度都相同。 (如果其中一个长度错误,则必须缺少数据并且数组不能正确对齐)。

我不喜欢这样做的想法......

if(array1.length != array2.length || array1.length != array3.length etc...)

这看起来很可怕,我真的希望有一种更优雅的方式...

我的冲动是将它们的长度加在一起并除以数组的总数,看看这个数字是否与数组长度相同,但我愿意接受建议(以及被告知我的数据)由于某些我忽略的原因,这个想法是行不通的。

我是Java,但我怀疑这个问题的答案是语言不可知的。

4 个答案:

答案 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等等。