2

課題で与えられた擬似コードをコーディングしようとしていますが、現在行っているコーディング部分は課題の一部ではなく、楽しみのためだけのものです。

擬似コードの一部には、「配列の要素を交換する」と書かれています。私のコードでは、これを2か所で行う必要があります。ただし、1つのメソッドのみを作成する方法、つまり、メソッドを交換して実行するたびに使用した余分なコード行を保存する別のメソッドを作成する方法があるかどうか疑問に思いました。

問題は、これ以外の新しいメソッドを作成する場合、配列をパラメーターとして送信して取得する必要があることです。これは効率が低下するのではないかと心配しています(明らかに大したことではありません)。ここですが、私は将来のより大きなプロジェクトのために学ぼうとしています)。

これは、繰り返される「swap」メソッド行を含む私のコードです。

public int[] myAlgorithm(int[] arrayOfInts, int size){
    boolean done = true;
    int j= 0;

    while (j <= n-2){
        if (arrayOfInts[j] > arrayOfInts[j+1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j = j + 1;
    }
    j = size - 1;
    while (j >= 1){
        if (arrayOfInts[j] <= arrayOfInts[j-1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j--;
    }
    if (!done)
        myAlgorithm(arrayOfInts, size)
    else
        return arrayOfInts;
}
4

5 に答える 5

3

配列をパラメータとして送信し、それも取得する必要があります

「送信」してアレイを直接操作するだけです。実際には、パラメーターをメソッドに渡すことは非常に安価な操作であり、頻繁に呼び出されると、とにかくコンパイラーによって最適化される可能性が高いため、あまり心配する必要はありません(プロファイリングによってパフォーマンスが低下することが証明されない限り)あなたの申請)。

あなたの場合、あなたは次のような方法を持つことができます:

public void swap(int[] arrayOfInts, int i, int j) {
    int tempHolder = arrayOfInts[i];
    arrayOfInts[i] = arrayOfInts[j];
    arrayOfInts[j] = tempHolder;
}

そしてあなたはそれを呼ぶでしょう:

swap(arrayOfInts, j, j+1);

なぜそれが機能するのですか?

Javaは引数を値で渡しますが、オブジェクト(つまり、配列を含む非プリミティブ型)の場合、渡される値はオブジェクトへの参照です。つまり、swapメソッドへの引数は、呼び出し元のコードと同じ配列への参照であるため、呼び出し元のメソッドに送り返すことなく、その配列を直接操作できます。

于 2013-01-23T22:46:49.960 に答える
1

コードのビットが重複している場合は、実行にかかる時間が短くなります。ただし、より多くのスペースが必要です。

問題は、コンパイラがコードをどのように最適化するかを予測できないことです。配列と2つのインデックスを取得し、それらのインデックスの要素を交換する関数を作成できます。コンパイラーは、呼び出し元の関数にコードをインライン化する場合があります。そうしないと、コンパイラはコードが重複していることに気づき、必要に応じて関数を作成する可能性があります。

特に効率の差が非常に小さい場合は、コードを最もよく読めるように記述してください。

于 2013-01-23T22:46:55.783 に答える
1

問題は、これ以外の新しいメソッドを作成する場合、配列をパラメーターとして送信し、それも取得する必要があることです...

これは実際にはそうではありません。Javaでは、配列はオブジェクトです。したがって、配列をメソッドに渡すときは、実際には配列への参照のみを渡します。メソッド内の配列に加えた変更は、メソッド呼び出しの後にそこに反映されます。配列への参照のみを渡すことは、配列全体のコピーを作成しないため、メソッドが非常に高速になることも意味します。

したがって、スワップメソッドを記述できます。

private void swap(int[] arrayOfInts, int i, int j) {
    int temp = arrayOfInts[i];
    arrayOfInts[i] = arrayOfInts[j];
    arrayOfInts[j] = temp;
}
于 2013-01-23T22:48:10.167 に答える
1

配列は、他の参照型のオブジェクトと同様に、参照によって渡されます。つまり、オブジェクトへの参照は値によって渡されます。つまり、アレイ自体はコピーされません。したがって、「効率の低下」を恐れる理由はありません。

于 2013-01-23T22:48:16.560 に答える
1

Javaでは、配列を変数として渡すことができます。これにより、配列へのポインターのみが渡され、配列のまったく新しいコピーは渡されないため、配列と交換する2つのインデックスを渡す必要があります。

 public static void swap(final int[] arr, final int         pos1, final int pos2){
final int temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
}
于 2013-01-23T22:49:07.673 に答える