web-dev-qa-db-ja.com

Javaでスワップメソッドを書くことは可能ですか?

問題は次のとおりです。2つの変数を交換するメソッドを記述します。これらの2つの変数はプリミティブでなければなりません。一般的なものである必要はありません。 2つのint変数。方法はありますか?!

49
AraK

配列またはオブジェクトを使用しないと、いや、メソッド内でそれを行うことはできません。

45
Thomas Owens

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)がすべての引数が左から右に評価されること(評価の順序が定義されていない他の言語とは異なり、実行順序は次のとおりです。

  1. bの元の値は、関数の最初の引数として渡されるために評価されます
  2. 式_b = a_が評価され、結果(bの新しい値)が関数の2番目の引数として渡されます
  3. 関数が実行され、bの元の値を返し、その新しい値を無視します
  4. 結果をaに割り当てます

returnFirstが長すぎる場合は、短い名前を選択してコードをコンパクトにすることができます(例:a = sw(b, b = a))。これを使用して友達を感動させ、敵を混乱させてください:-)

48
marcus

詳細を説明するJavaWorldの記事をご覧ください。

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

プリミティブはJavaで値渡しされるため、2つのプリミティブのスワップは機能しません。そのために2つのオブジェクトを交換するメソッドを書くことさえできません。

@Thomasが言ったように、できることは、他のオブジェクト/配列内にプリミティブを含め、それらを変更することだけです。

18

プリミティブ数の1ライナー:

a += (b - (b = a));
6
Oleg Mikhailov

同じタイプの任意の数のオブジェクトをスワップする@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);
4
dansalmo

Java5では、あなたに役立つかもしれない最も近いと思うことができます:

AtomicIntegerクラス(およびその他)には、getAndSet()アトミックメソッドがあります。

2
KLE

プリミティブをスワップするスワップメソッドを記述するには、「out」変数、つまり値が呼び出し側コンテキストに渡される変数の概念が必要です。 C#にはこれらがありますが、それらが変数であることを指定する必要があります。

2
Michael Wiles

これは、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;
    }
}

繰り返しますが、私はこれの使用が何であるかを確認できません

1
wonderer

この関数は2つのintを交換します

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}
1
Fadi Hatem

トーマス・オーエンズが言ったように。おそらく変数を&referenceで渡すことでCで実行できますが、オブジェクトを使用せずにJavaではなくafaikを使用できます。

0
Chris Holland