20

如何在不使用第三个变量(即 temp 变量)的情况下在 Java 中交换两个字符串变量?

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

但这里还有第三个变量。我们需要消除第三个变量的使用。

4

18 回答 18

36

在不使用第三个变量的情况下这样做:

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 版,第 15.12.4.2 节)所有参数都是从左到右评估的(与其他一些语言不同,评估的顺序是未定义的),所以执行顺序是:

  1. 的原始值b被评估以便作为第一个参数传递给函数
  2. 计算表达式b = a,并将结果(的新值b)作为第二个参数传递给函数
  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];

只要您的字符串中不包含 # 字符,这将起作用。随意使用任何其他字符。

您可以使用可能的 Unicode 字符,例如“\u001E”而不是 #。

于 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 回答
1
String name = "george";
String name2 = "mark";
System.out.println(name+" "+name2);
System.out.println(name.substring(name.length()) + name2 +  " "+ name );

这里 substring(); 方法返回空字符串。因此,可以附加名称。

于 2018-05-16T12:31:14.797 回答
1
String str1 = "first";
String str2 = "second";

str1 = str2+str1;
str2 = str1.substring(str2.length(),str1.length());
str1 = str1.substring(0,(str1.length() - str2.length()));

System.out.println(str1);
System.out.println(str2);
于 2016-01-27T13:22:30.703 回答
0

干得好。尝试这个:

String a = "one";
String b = "two";
//String temp=null;
int i = a.length();
a += b;
b = a.substring(0, i);
a = a.substring(i, a.length());
System.out.println(a + " " + b);

将任何值作为变量中的字符串。这将是交换。

于 2013-08-30T08:57:55.070 回答
0
于 2014-10-01T06:56:17.787 回答
0

对于字符串方法 1:

public class SwapWithoutThirdVar{  
public static void main (String args[]){    
 String s1 ="one";
 String s2 ="two";
 s1= s1+s2;
 s2 = s1.substring(0,(s1.length()-s2.length()));
 s1 = s1.substring(s2.length()); 
 System.out.println("s1 == "+ s1);
 System.out.println("s2 == "+ s2);

}
}

方法二:

public class SwapWithoutThirdVar
{
public static void main (String[] args) throws java.lang.Exception
 {
 String s1 = "one";            
 String s2 ="two";          
 s1=s2+s1;
 s2=s1.replace(s2,"");
 s1=s1.replace(s2,"");         
 System.out.println("S1 : "+s1); 
 System.out.println("S2 : "+s2);
  }
}

对于整数

公共类 SwapWithoutThirdVar {

public static void main(String a[]){
    int x = 10;
    int y = 20;       
    x = x+y;
    y=x-y;
    x=x-y;
    System.out.println("After swap:");
    System.out.println("x value: "+x);
    System.out.println("y value: "+y);
}
}
于 2017-06-09T06:31:53.250 回答
0

我只想指出,以防万一有人通过这个线程查看。如果不使用第三个变量,就无法交换两个字符串。在 Java 示例中,由于字符串是不可变的,因此 a=a+b 创建了第三个字符串,并且不会重新分配 a。执行 reverseString 会创建一个新变量,但这次是在堆栈帧上,因为程序进入新范围。异或交换的使用可能有效,但字符串在 java 中是不可变的,因此异或交换也会创建一个临时变量。所以事实上,除非该语言允许您重新分配到相同的内存空间,否则在不创建新变量的情况下交换字符串是不可能的。

于 2020-10-01T18:40:08.100 回答
0

您也可以通过使用临时变量来执行此操作,但方式不同:

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

temp=a.concat(b);
b=temp.substring(0,a.length());
a=temp.substring(a.length(),temp.length());

System.out.println("After Swapping A:"+a+"B:"+b);
于 2020-05-07T15:14:50.080 回答
0

你可以这样做。

public static void main(String[] args) {
        // TODO Auto-generated method stub

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

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

        a = a+b;
        b = "";

        System.out.println("*************");
         b = a.substring(0, 3);
         a = a.substring(3, 6);

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

    }
于 2018-03-23T06:50:09.610 回答
0
String a = "one";//creates "one" object on heap
String b = "two";// creates "two" object on heap
System.out.printf("a is %s , b is %s%n",a,b);
a = "two";// will not create new "two" object & now a is pointing to "two" object
b = "one";// will not create new "one" object & now b is pointing to "one" object
System.out.printf("a is %s , b is %s%n",a,b);
于 2019-08-16T18:42:59.370 回答
0

如果您添加 replaceFirst() 并使用正则表达式,则Jj Tuibeo 的解决方案有效:

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

包 com.core;

公共类 SwappingNoTemp {

public static void main(String[] args) {

    String a = "java";
    String b = "c";

    a = a + b;

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

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

}

}

于 2018-04-13T06:14:19.157 回答
-1

对于字符串:

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

a = a + b;
b = a.replace(b, "");
a = a.replace(b, "");
于 2013-08-30T08:58:08.507 回答
-1
public class ex{
    public static void main(String[] args){

        String s1="abc";
        String s2="def";

        System.out.println(s1);
        System.out.println(s2);

        s3=s2.replaceAll(s1,s2=s1);

        System.out.println(s1);
        System.out.println(s2);

    }
}
于 2018-02-24T12:09:36.520 回答