-5

我必须比较两个数组是否相等,只忽略第一个元素。是否可以在不迭代的情况下实现相同的目标

4

6 回答 6

9

您可以使用Arrays.copyOfRange()来获取子数组并Arrays.equals()执行相等性检查。

请注意,虽然没有明确的迭代 - 在幕后有迭代。

代码快照:

int arr1[] = { 1,2,3,4 };
int arr2[] = { 0,2,3,4 };
System.out.println(Arrays.equals(
        Arrays.copyOfRange(arr1, 1, arr1.length), 
        Arrays.copyOfRange(arr2, 1, arr2.length)));
于 2013-01-10T11:11:25.267 回答
1

无论您尝试什么,为了检查两个数组是否相等,您必须检查每个元素。为此,您必须通过遍历数组来访问所有元素。尽管如此,您可以通过使用一些内置来避免手动执行此操作功能,相同的逻辑发生在幕后。

于 2013-01-10T11:13:46.300 回答
0

是的。

假设您的两个数组分别命名为 A 和 B。


  1. 创建由 A 中除第一个元素( System.arraycopy(A, 1, C, 0, A.length();)之外的所有元素组成的数组 C。
  2. 创建由 B 中除第一个元素之外的所有元素组成的数组 D。
  3. 调用Arrays.equals()比较 C 和 D。

另外,请记住 Renjiths 的观点。

于 2013-01-10T11:15:26.500 回答
0
String[] array1 = {"hi","hi2"};
List<String> temp = new ArrayList<String>(Arrays.asList(array1));

String[] array2 = {"hi3","hi2"};
List<String> temp2 = new ArrayList<String>(Arrays.asList(array2));

boolean condition = temp.subList(1, temp.size()).equals(temp2.subList(1, temp2.size()));

正如阿米特已经指出的那样,幕后有迭代

于 2013-01-10T11:16:04.937 回答
0
Arrays.equals(Arrays.asList(array1).subList(1, array1.length), Arrays.asList(array2).subList(1, array2.length));

Arrays.equals 将使用循环。

于 2013-01-10T11:16:34.353 回答
0

我相信您(或您调用的方法)将不得不遍历这些数组,因为数组不是对象并且没有 equals 方法。

运算符 == 仅在原始类型的情况下比较值,在其他情况下它比较指针(内存地址)。这意味着只有当两个数组都是一个且相同时,你才会得到真,如果数组是两个独立但相同的数组,你会得到假。

复制一部分数组并比较它们会导致数组的多次迭代,即使它可能并不明显。(获取两个数组的子数组每个都包含至少 1 次迭代,并将它们进行比较。)

也就是说,您可以使用 1 个周期来遍历数组并逐个比较值,从索引 1 开始跳过第一个元素。在以下代码中将 Object 类型参数替换为您的数组类型:

private boolean compareMyArrays(Object[] array1, Object[] array2) {
    if ((array1 == null) && (array2 == null)) {
        return true;
    }

    if ((array1 == null) || (array2 == null)) {
        return false;
    }

    if (array1.length != array2.length) {
        return false;
    }

    for (int i = 1; i < array1.lenght; i++) {
        if ( !array1[i].equals(array2[i]) ) {
            return false;
        }
    }

    return true;
}

希望这可以帮助。

于 2013-01-10T11:45:01.403 回答