20

3 番目の変数、つまり temp 変数を使用せずに、Java で 2 つの文字列変数を交換するにはどうすればよいですか?

String a = "one"
String b = "two"
String temp = null;
temp = a;
a = b;
b = temp;

しかし、ここに 3 番目の変数があります。3 番目の変数の使用を排除する必要があります。

4

18 に答える 18

36

3 番目の変数を使用せずに、次のようにします。

String a = "one";
String b = "two";

a = a + b;
b = a.substring(0, (a.length() - b.length()));
a = a.substring(b.length());

System.out.println("a = " + a);
System.out.println("b = " + b);
于 2013-08-30T09:01:24.967 に答える
12

// この回答から抜粋: https://stackoverflow.com/a/16826296/427413

String returnFirst(String x, String y) {
    return x;
}

String a = "one"
String b = "two"
a = returnFirst(b, b = a); // If this is confusing try reading as a=b; b=a;

これが機能するのは、Java 言語が (Java 言語仕様、Java SE 7 Edition、セクション 15.12.4.2) すべての引数が左から右に評価されることを保証しているためです (評価の順序が定義されていない他の言語とは異なります)。は:

  1. の元の値はb、関数の最初の引数として渡されるために評価されます
  2. b = aが評価され、結果 ( の新しい値b) が 2 番目の引数として関数に渡されます。
  3. 関数が実行され、元の値が返され、b新しい値は無視されます
  4. あなたは結果をa
  5. これで値が交換され、宣言する必要がなくなりましたtemp。パラメータxは としてtemp機能しますが、関数を一度定義するとどこでも使用できるため、見栄えが良くなります。
于 2013-09-30T21:07:54.267 に答える
6
String a="one";
String b="two";

a = a.concat("#" + b);
b = a.split("#")[0];
a = a.split("#")[1];

これは、文字列に # 文字が含まれていない限り機能します。代わりに他のキャラクターを自由に使用してください。

# の代わりに「\u001E」のような Unicode 文字を使用できます。

于 2013-08-30T09:00:46.167 に答える
2
public class SwapStringVariable {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a = "test";
        String b = "paper";

        a = a + b;
        b = a.substring(0, a.length()  - b.length());
        a = a.substring(b.length(), a.length());

        System.out.println(a + " " + b);


    }

}
于 2014-06-18T06:02:44.013 に答える
1

最も簡単な方法を以下に示します。

String a = "one";
String b = "two";
System.out.println("Before swap: " a + " " + b);
int len = a.length();
a = a + b;
b = a.substring(0, len);
a = a.substring(len);
System.out.println("After swap: " a + " " + b);
于 2013-08-30T09:01:28.100 に答える
0

Jj Tuibeo のソリューションは、replaceFirst() を追加して正規表現を使用すると機能します。

a += b;
b = a.replaceFirst(b + "$", "");
a = a.replaceFirst("^" + b, "");
于 2015-09-26T19:48:20.657 に答える
0

誰かがこのスレッドを調べた場合に備えて、指摘したいと思います。3 番目の変数を使用せずに 2 つの文字列を交換する方法はありません。Java の例では、文字列は不変であるため、a=a+b は 3 番目の文字列を作成し、a を再割り当てしません。reverseString を実行すると、新しい変数が作成されますが、今回はプログラムが新しいスコープに入るため、スタック フレームに作成されます。Xor スワッピングの使用は機能する可能性がありますが、文字列は Java では不変であるため、xor スワップも一時変数を作成します。実際、言語で同じメモリ空間に再割り当てできない限り、新しい変数を作成せずに文字列を交換することはできません。

于 2020-10-01T18:40:08.100 に答える
-1

文字列の場合:

String a = "one"
String b = "two"

a = a + b;
b = a.replace(b, "");
a = a.replace(b, "");
于 2013-08-30T08:58:08.507 に答える