ここに質問があります:2つの変数を交換するメソッドを書いてください。これらの2つの変数はプリミティブである必要があります。一般的なものである必要はありません。たとえば、2つのint
変数です。方法はありますか?!
13 に答える
2つの変数を単純に交換する関数を作成することはできませんが、次のことを可能にするヘルパー関数を作成することは可能です。
- 1つのステートメントのみを使用して2つの変数を交換します
- 呼び出し元のコードに一時変数がない
- 「ボクシング」プリミティブなし
- いくつかのオーバーロード(そのうちの1つはジェネリックを使用)で、どのタイプでも機能します
それがあなたがそれをすることができる方法です:
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が言ったように、あなたができる唯一のことは、プリミティブを他のオブジェクト/配列に含めて、それらを変更することです。
プリミティブ数のワンライナー:
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()
アトミックメソッドがあります。
プリミティブをスワップするスワップメソッドを作成するには、「出力」変数、つまり値が呼び出し元のコンテキストに渡される変数の概念を持っている必要があります。C#にはそれらがありますが、それでも変数であると指定する必要があります。
この関数は2つのintを交換します
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
これが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;
}
}
繰り返しになりますが、これをどのように使用できるかわかりません。
私は、スワッピングプログラムがc ++で書かれているように、Javaで書くことができないと言われている理由についての説明を求めて、上記の回答を読みました。私は次の方法で プログラムのスクリーンショットを作成しました
トーマスオーエンスが言ったように。おそらく変数を&referenceで渡すことで、Cでそれを行うことができますが、オブジェクトを使用せずにJavaで行うことはできません。
はい、メソッドを使用して2つの変数を交換することは可能です。 ただし、そのメソッドを空の括弧で宣言してから、reference(空の括弧)で呼び出す必要があります。これは、メソッドを使用した2つの変数の交換を示す例です。
パブリッククラススワッピング
{{
static String A="Apple";
static String B="Bat";
public static void swap()
{
String k;
k=A;
A=B;
B=k;
}
public static void main(String[] args)
{
System.out.println("Before swapping");
System.out.println("A= "+A);
System.out.println("B= "+B);
swap();
System.out.println("After swapping");
System.out.println("A= "+A);
System.out.println("B= "+B);
}
}
上記のコードをコンパイルすると、出力は次のようになります。
交換する前に
A=アップル
B=バット
交換後
A=バット
B=アップル
//参照による呼び出しの場合、呼び出されたメソッドに変更を加えた場合、元の値が変更されます
public class Swap
{
public static void main (String[]args)
{
int y = 5;
int x = 4;
int c;
System.out.println("y = "+y);
System.out.println("x = "+x);
c=x; //c = 4
x=y; //x = 5;
y=c;
System.out.println("\n");
System.out.println("y= "+y);
System.out.println("x= "+x);
}
}