比较两个数组。错误的返回值(1)

时间:2014-11-21 14:40:19

标签: java arrays methods return main

我制作了这个方法来比较两个数组的数量,然后返回多少个数字彼此相等,但无论有多少个数相等,该方法每次都返回值1。 (两个数组长度相同)。

public static void main(String[] args) {
    int a []  = {1, 4, 6, 7, 8, 10, 13};
    int b []  = {1, 2, 3, 4, 5, 6, 7};

    equal(a,b);

}


public static int equal(int[] a, int[] b){
    int j = 0;
    for(int i = 0; i< a.length-1;i++){

        if(a[i] == b[i]){
            j++;
        }
    }
    System.out.println(j);
    return j;
}

4 个答案:

答案 0 :(得分:8)

您的代码在同一索引处找到与相等的数字。

有几种方法可以找到交叉点的大小。

一个简单的但是O(m * n)实现将遍历a的每个元素的b的所有元素。

如果数组已排序,您可以为这两个数组使用单独的索引,当它们不再匹配时推进每个数组。这将是O(m + n)。 (如果它们没有排序,你可以先对它们进行排序,费用为O(m log m + n log n)。

如果每个数组都没有重复的成员,另一种方法是根据设置差异的大小来计算交集的大小。这方面的一个例子是http://ideone.com/6vLAfn。关键部分是将每个数组转换为一个集合,并通过从另一个集合中删除一个集合来确定共有多少成员。

 int aSizeBefore = setA.size();
 setA.removeAll( setB );
 int aSizeAfter = setA.size();
 return aSizeBefore - aSizeAfter;

答案 1 :(得分:2)

如果要检查数组a中的任何单个数字是否也在数组b中,则应使用嵌套for循环。

e.g。

int numMatches = 0;
for (int i = 0; i < a.length; ++i)
{
    for (int j = 0; j < b.length; ++j)
    {
        if (a[i] == b[j])
            ++numMatches; //Naive, as obviously if the same number appears twice in a it'll get counted twice each time it appears in b.
    }
}

当前代码只检查相同索引匹配的元素,即

1 == 1 // Yes, increment j
4 == 2 // Nope
6 == 3 // Nope
7 == 4 // Nope
8 == 5 // Nope
10 == 6 // Nope
13 == 7 // Nope

答案 2 :(得分:2)

具有相同值的元素可能位于不同的索引中。假设数组已排序,您可以编写如下:

public static int equal(int[] a, int[] b) {
    int count = 0;
    for(int i = 0; i < a.length - 1; i++) {
        for(int j = 0; i < b.length - 1; j++) {

            if (a[j] < b[j]) {
                // we came to the part where all elements in b are bigger 
                // than our selected element in a
                break;
            }
            else if (a[j] == b[j]) {
                count++;
            }
        }
     }
     System.out.println(count);
     return count;
}

如果您无法保证数组已排序,则可以删除if-block并从循环中删除else-if的其他内容。

答案 3 :(得分:0)

如果您想知道两个阵列中有多少个数字,并且保证订购它们,您应该尝试以下方法:

public static int equal(int[] a, int[] b) {
        int j, result = 0;
        int lastFound = 0;
        for (int i = 0; i < a.length - 1; i++) {
            for (j = lastFound; j < b.length; j++) {
                if (a[i] == b[j]) {
                    result++;
                    lastFound = j;
                    break;
                } else {
                    if (a[i] < b[j]) break;
                }
            }
        }
        return result;

    }

使用变量lastFound将加快循环速度,但只有在排序数组时才有用,如示例所示。