1

私は現在、配列のいくつの項目が他の配列とまったく同じ位置にあり、いくつが異なる位置にあるのかを返す小さな関数を書いています。

関数は現在次のようになっています。

public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i]) counter[0]++;
        else {
            for (int n = 0; n < leftarray.length; n++) {
                if (leftarray[i] == rightarray[n] && leftarray[n] != rightarray[n]) {
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}

これは、のとleftarray(1, 2, 3, 4)と言ってみましょうrightarray(4, 3, 2, 2)

それが返されます(0, 3)(0の完全一致、3はそこにありますが、異なる位置にあります)

しかし今問題:

入力と出力を交換するとleftarray、どちらが間違っているか(最初のものと同じである必要があります)(4, 3, 2, 2)rightarray(1, 2, 3, 4)(0, 4)

誰かが私を助けてくれることを願っています。どうも

4

4 に答える 4

0
public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;
    boolean taken[] = new boolean[rightarray.length];
    for (int i=0;i<taken.length;i++)
        taken[i] = false;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i])
        {
            counter[0]++;
            taken[i]=true;
        }
    }

    for (int i = 0; i < leftarray.length; i++)
    {
        if (!taken[i])
        {
            for (int j = 0; j < rightarray.length; j++) {
                if (leftarray[i] == rightarray[j] && i!=j && !taken[j]) { // you can remove i!=j because its already don't apply because of !taken[i]
                    taken[j] = true;
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}
于 2013-09-27T12:17:09.020 に答える
0

これを試して:

public static int[] numCorrects(char[] leftarray, char[] rightarray){
    int counter[] = new int[2];
    counter[0] = 0;
    counter[1] = 0;
    boolean taken[] = new boolean[rightarray.length];
    for (int i=0;i<taken.length;i++)
        taken[i] = false;

    for (int i = 0; i < leftarray.length; i++) {
        if(leftarray[i]==rightarray[i]){ counter[0]++; taken[i] = true; }
        else {
            for (int n = 0; n < leftarray.length; n++) {
                if (leftarray[i] == rightarray[n] && leftarray[n] != rightarray[n] && !taken[n]) {
                    taken[n] = true;
                    counter[1]++;
                    break;
                }
            }
        }
    }
    return counter;
}
于 2013-09-27T12:07:22.220 に答える
0

ブレークを削除すると、同じ結果が得られます。

于 2013-09-27T12:07:33.560 に答える