【问题标题】:Best way to make sure several arrays are the same length确保多个数组长度相同的最佳方法
【发布时间】:2011-10-20 07:57:25
【问题描述】:

出于我不想深入讨论的原因,我有一堆并行数组,我很好奇确保它们长度相同的最优雅的方法是什么。 (如果其中一个长度错误,则肯定有数据丢失,数组无法正确对齐)。

我不喜欢做...的想法

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

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

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

我在使用 Java,但我怀疑这个问题的答案与语言无关。

【问题讨论】:

  • 你已经知道了,但正确的解决方案是“不要使用并行数组”。
  • 你的冲动也行不通:如果你有长度为 2、1 和 3 的数组,则平均值为 2,与第一个数组相同,但它们的长度都不同。跨度>
  • 好吧,你说的完全没用——博士。德雷德尔。作者特意说过,由于某种原因,他必须使用并行数组。有时为了方便、实际需要和依赖约束,你不得不打破编程的一些崇高思想。
  • 如你所料...我对此一点也不兴奋...但我在别人的代码中,无法解开这个特殊的毛线球。尽管如此,我还是想知道这个问题的答案,如果只是想知道是否有一些非常好的方法可以在一个优雅的测试中比较一堆事物的相等性。
  • @andrew...谢谢...这正是我希望的“不会剪掉它”的例子...我会责怪自己没有想到这是我的今天在我屏幕前的第 15 小时 :)

标签: java arrays


【解决方案1】:

你可以写一个这样的方法(使用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。 (1) 返回一个布尔值不是更好吗? (2) 测试不应该是if (arrays.length &lt; 1)吗?
  • @Jiri,如果你传递的数组少于两个(即一个或零),那么所有这些显然都是等长的。
  • @Jiri:我更喜欢异常,因为boolean 返回值太容易被忽略,并且异常包含更多信息。但是,这取决于您的设计选择。我 length &lt; 1,但如果arrays 包含一个数组,那么它根据定义具有正确数量的元素。唯一未测试的情况是单个参数不是数组。
  • @Jiri:我将它改回&lt; 1,以便它检查您以错误方式调用它的情况(例如checkAParallelArrays("foo") 应该抛出IllegalArgumentException)。
  • 不应该是arrays.length
【解决方案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[]),以及一些语义错误(例如捕获转换异常)。但你明白了。

【讨论】:

    【解决方案3】:

    Joachim 代码的一个简单变体:

    public static boolean areSameLength(Object[]... arrays) {
          int N = arrays[0].length;
          for (Object[] a : arrays)
             if (a.length != N)
                return false;
           return true;
         }
    

    【讨论】:

      【解决方案4】:

      我认为解决方案是检查所有数组的长度属性,看看它们是否都相同。假设数组是String s[], Object s2[], int[] s3,只用s.length == s1.length 等等。

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2010-09-25
        • 2011-06-16
        • 2020-08-22
        相关资源
        最近更新 更多