0

現在、プログラムでこのコードに取り組んでいますが、問題は 2 次元の内部ループを停止する行にあるようです。

これは配列のサンプル出力です

  • 9 6 6
  • 7 6 4
  • 4 8 5

このコードを実行すると、出力は次のようになります。

  • 4 4 6
  • 5 6 6
  • 7 8 9

私の期待される出力は次のとおりです。

  • 4 4 5
  • 6 6 6
  • 7 8 9

a digit:"6" は正しい場所にありません。for ループの上にネストされた for ループがある部分を実行しようとすると、1 回しか実行されないため、6 である 3 番目の列に到達するのではなく、1 番目の列のみをチェックするためです。問題は、行#0 列#0 から行#2 列#0 までの最大数のみを読み取るようにそのループを制限する必要があることです。

この問題を解決するにはどうすればよいですか?? 私は一次元配列を使用することを考え、すべての二次元配列要素を配置してそこに並べ替え、それを二次元配列に戻して再度印刷しましたが、それでは私のコードは二次元配列の並べ替えに必要なプロセスを解決しません。

public static void sortArray(){
    int x = len-1, y = len-1;
    int iKey=0,jKey=0;
    int cnt=0;
    do{
        cnt++;
        if(y==-1){
            x--;
            y=len-1;
        }
        System.out.println(cnt+".)"+x+"-"+y);
        int hi = -1;
        for(i = 0;i <= x; i++)
            for(j = 0;j <= y; j++){
                if(twodiArray[i][j]>hi){
                    hi = twodiArray[i][j];
                    iKey = i;
                    jKey = j;
                }
            }

        int temp = twodiArray[iKey][jKey];
            twodiArray[iKey][jKey] = twodiArray[x][y];
            twodiArray[x][y] = temp;
            //dispArray();
        y--;
    }while(cnt<9);
}
4

3 に答える 3

1

問題は、最大要素を検索するループにあります。配列 5x5 と があるx=1としy=1ます。次に、ループは次の要素のみをチェックします: [0][0]、[0][1]、[1][0]、[1][1]。ただし、[0][2]、[0][3]、[0][4] もチェックする必要があります。

前のコードでは、次のセルのみをチェックしました。

XX...
XX...
.....
.....
.....

ただし、これらを確認する必要があります。

XXXXX
XX...
.....
.....
.....

したがって、次のようなものが必要です。

for(i = 0;i <= x; i++) {
    int upper; // How many elements we need to check on current row.
    if (i != x) {
       upper = len - 1; // We are not in last row, so check all elements.
    } else {
       upper = y; // On the last row we need to check only elements up to y.
    }
    for(j = 0;j <= upper; j++){
        if(twodiArray[i][j]>hi){
            hi = twodiArray[i][j];
            iKey = i;
            jKey = j;
        }
    }
}

私のコードは、最後の行まですべての行を完全にチェックします。

編集

使用する場合:

for (int i = 0; i <= x; i++) {
    for (int j = 0; j <= y; j++) {
        ...
    }
}

次に、(0,0) の左上隅と (y,x) の右下隅を持つ四角形でのみ反復します。例: x = 4、y = 3:

XXX...
XXX...
XXX...
XXX...
......

しかし、あなたの目標は、最後の行の前のすべての行を完全に実行することです。したがって、0、1、2 行をすべてチェックし、3 行目から 3 つの要素をチェックします。私のコードはそれを行います。upper等しい最後の行を除くすべての行をチェックする必要がある行からの値の数を示しますlen - 1(行全体をチェックしてください)。最後の 1 つはy.

于 2013-01-08T15:47:40.750 に答える
0

個人的には、混乱を避けるために、1D配列のように考えます。

// I'm assuming that columnCount and rowCount are stored somewhere
public int getNthElement(int index) {
    int colIndex = index % columnCount;
    int rowIndex = (index - colIndex) / rowCount;
    return twodiArray[rowIndex][colIndex];
}

public void setNthElement(int index, int value) {
    int colIndex = index % columnCount;
    int rowIndex = (index - colIndex) / rowCount;
    twodiArray[rowIndex][colIndex] = value;
}

public void sortArray(int[][] array) {
    int elementCount = rowCount * columnCount;
    int curIndex = elementCount - 1;

    while (curIndex >= 0) {
        int highestIndex = -1;
        int highestValue = 0;

        for (int i = 0; i <= curIndex; i++) {
            int nthValue = getNthElement(i);
            if (nthValue > highestValue) {
                highestIndex = i;
                highestValue = nthValue;
            }
        }

        int swapValue = getNthElement(curIndex);
        setNthElement(curIndex, highestValue);
        setNthElement(highestIndex, swapValue);

        curIndex--;
    }
}

私はまだ2D配列を使用しており、実際の1D配列を使用していないことがわかりますが、このコードは、1D配列であるかのように配列にインデックスを付けます。(うまくいけば、それはあなたの教授の目には有効です)

于 2013-01-08T16:17:46.290 に答える
0

スワップ コード (で始まるint temp = twodiArray) は、メインの反復ループの外にあります。最も内側のループ内に移動する必要があります。

ところで、インデックスを保存せずにスワップを行うことができます。

于 2013-01-08T15:51:45.297 に答える