8

数値を交換するために 3 番目の変数を使用する必要は何ですか? 申し訳ありませんが、わかりません。

これは、各要素の長さに基づいて配列の要素を並べ替えるためのサンプル コードです。ここでわかるように、3 番目の変数を使用して、配列の要素を交換しています。このプログラムには別の実装がありますが、オンラインで以下の例を見つけました。スワッピングが何に役立つのかを理解したいですか? 誰かが私にそれを説明できたら、それは素晴らしいことです.

public class StringSort {
    public static void main(String[] args) {
        String[] arr = new String[] { "abcd", "dexter", "stringsortexample", "fruit", "apple","car" };              
        compareArrayElements(arr);      

        System.out.println("The strings in the sorted order of length are: ");
        for (String sortedArray : arr) {
            System.out.println(sortedArray);
        }
    }

    public static void compareArrayElements(String[] arr) {
        String temp = "";
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if (arr[i].length() > arr[j].length())
                {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }       
    }
}
4

12 に答える 12

23

簡単に言えば、Java ではジャグリングできないということです。

各変数は、1 つの値を「保持」できる手と考えてください。例えばボール。

2 つの手と 2 つのボールがある場合、ボールを反対側の手に切り替える唯一の方法は、ボールの 1 つを空中に投げること (またはそのようなこと) です。しかし、Java には「値を空中に投げる」操作はありません。

ジャグリングができない場合は、ボールを交換するためにサードハンド (またはその他の一時的な保持場所) が必要です。Java 用語では、一時変数を意味します。

記録として、私がプログラミングを学んでいたとき、この類推は非常に役に立ちました。しかし、やりすぎないでください:-)。


(実際、整数について話している場合、数値を交換するために使用できる数学的なトリックがあります... XORを含む...しかし、一般的には機能しません。)

于 2013-10-07T06:31:53.880 に答える
4

ここにあるコードは、よく知られているbubble-sortです。配列/リストの値をソートするために使用されるアルゴリズムです。このアルゴリズムは、隣接する変数のすべてのペアを比較し、順序が間違っている場合はそれらを交換します。この記事には、スワッピングとは何かを理解するのに役立つ小さなアニメーション画像があります。それを見てください。
たとえば、次pythonのように、一時変数を使用せずに 2 つの変数を交換できます。

a, b = 1, 2
a, b = b, a # b is 1 and a is 2 now

しかし、Java や私が知っている C のような構文を持つ他の言語 (C、C++、C#) では、2 つの変数を交換する場合、最初の変数の値を一時変数に格納し、2 番目の変数の値を最初の変数に割り当てる必要があります。次に、一時変数に格納された値 (実際には最初の変数の値) を 2 番目の変数に割り当てます。これが仕組みです。

于 2013-10-07T05:59:42.493 に答える
1

3 番目の変数を使用せずにスワップしようとしたとしましょう。

arr[i] = arr[j];
arr[j] = arr[i];

ここには明らかな問題があります。arr[j] を arr[i] に、またはその逆に割り当てたので、それらは互いに等しくなります。3 番目の変数を使用すると、上書きした変数の内容を一時的に保存してから、それを他の変数に割り当てることができます。

于 2013-10-07T06:02:32.903 に答える
0

スワッピングは、配列の順序を変更するのに役立ちます。場合によっては、配列を並べ替えたりランダム化したりしたい場合があります。その場合、目的の結果を得るために要素を交換する必要があります。

1 つの変数を一時的に保存する必要があるため、3 番目の変数が必要です。その場合、 の内容をのarr[i] = arr[j]内容でオーバーライドするため、保存していない場合はその値が失われます。arr[i]arr[j]

(ビットいじりを伴う、いわゆるXOR スワップを行うことで、3 番目の変数を使用せずに値を交換できます。)

于 2013-10-07T05:59:23.347 に答える
-1

それはあなた次第です...どう使うか..例えば連立方程式を解くにはたくさんの方法がありますので、同じように実装するロジックもたくさんあり、好きなものを選ぶことができます。に...

この 1 つの懸念事項に関しては、ここで 3 番目の変数を使用すると、複雑さが解消され、読みやすさと理解が向上すると思います。

于 2013-10-07T05:59:44.133 に答える