問題は次のとおりです。2つの変数を交換するメソッドを記述します。これらの2つの変数はプリミティブでなければなりません。一般的なものである必要はありません。 2つのint
変数。方法はありますか?!
配列またはオブジェクトを使用しないと、いや、メソッド内でそれを行うことはできません。
2つの変数を単純に交換する関数を記述することはできませんが、次のことを可能にするヘルパー関数を記述することは可能です。
それはあなたがそれを行うことができる方法です:
_int returnFirst(int x, int y) {
return x;
}
int a = 8, b = 3;
a = returnFirst(b, b = a); // try reading this as a = b; b = a;
System.out.println("a: " + a + ", b: " + b); // prints a: 3, b: 8
_
これは、Java言語保証(Java言語仕様、Java SE 7 Edition、セクション15.12.4.2)がすべての引数が左から右に評価されること(評価の順序が定義されていない他の言語とは異なり、実行順序は次のとおりです。
b
の元の値は、関数の最初の引数として渡されるために評価されますb = a
_が評価され、結果(b
の新しい値)が関数の2番目の引数として渡されますb
の元の値を返し、その新しい値を無視しますa
に割り当てますreturnFirst
が長すぎる場合は、短い名前を選択してコードをコンパクトにすることができます(例:a = sw(b, b = a)
)。これを使用して友達を感動させ、敵を混乱させてください:-)
詳細を説明するJavaWorldの記事をご覧ください。
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
プリミティブはJavaで値渡しされるため、2つのプリミティブのスワップは機能しません。そのために2つのオブジェクトを交換するメソッドを書くことさえできません。
@Thomasが言ったように、できることは、他のオブジェクト/配列内にプリミティブを含め、それらを変更することだけです。
プリミティブ数の1ライナー:
a += (b - (b = a));
同じタイプの任意の数のオブジェクトをスワップする@marcusのスワップメソッドの汎用バージョンを作成できます。
<T> T swap(T... args) { // usage: z = swap(a, a=b, b=c, ... y=z);
return args[0];
}
b = swap(a, a=b);
z = swap(x, x=y, y=z);
Java5では、あなたに役立つかもしれない最も近いと思うことができます:
AtomicIntegerクラス(およびその他)には、getAndSet()
アトミックメソッドがあります。
プリミティブをスワップするスワップメソッドを記述するには、「out」変数、つまり値が呼び出し側コンテキストに渡される変数の概念が必要です。 C#にはこれらがありますが、それらが変数であることを指定する必要があります。
これは、2つのプリミティブ変数を交換するメソッドです
private void swap(){
int a = 1;
int b = 2;
int temp = a;
a = b;
b = temp;
}
ただし、あまり役に立たないかもしれません;)
まあまあ、変数がクラスレベルであればそれを行うことができます。
public class MyClass{
// excuse horrible coding practice of public mutable fields
public int a = 1;
public int b = 2;
public void swap(){
int temp = a;
a = b;
b = temp;
}
}
繰り返しますが、私はこれの使用が何であるかを確認できません
この関数は2つのintを交換します
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
トーマス・オーエンズが言ったように。おそらく変数を&referenceで渡すことでCで実行できますが、オブジェクトを使用せずにJavaではなくafaikを使用できます。