是否可以用Java编写交换方法?
这个问题已经在这里有了答案:
如何用Java编写基本的交换功能 19个答案
交换原语的Java方法 8个答案
问题是:编写一个交换两个变量的方法。 这两个变量应该是原语。 它不需要是通用的,例如 两个int变量。 有办法吗?
13个解决方案
48 votes
虽然不可能编写简单地交换两个变量的函数,但是可以编写一个允许您执行以下操作的助手函数:
仅使用一条语句交换两个变量
调用者代码中没有临时变量
没有“装箱”原语
有一些重载(其中一个使用泛型),它适用于任何类型
那是你怎么做的:
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版,第15.12.4.2节)保证所有参数都是从左到右进行评估的(与其他一些语言一样,评估顺序未定义),因此执行顺序 是:
计算原始值returnFirst,以便将其作为第一个参数传递给该函数
计算表达式returnFirst,并将结果(新值a = sw(b, b = a))作为第二个参数传递给函数
该函数将执行,返回returnFirst的原始值,并忽略其新值
您将结果分配给returnFirst
如果returnFirst太长,则可以选择一个较短的名称以使代码更紧凑(例如a = sw(b, b = a))。 用它打动你的朋友并迷惑你的敌人:-)
marcus answered 2020-02-09T17:27:25Z
45 votes
如果不使用数组或对象,不可以,无法在方法中进行操作。
Thomas Owens answered 2020-02-09T17:26:15Z
18 votes
请查看此JavaWorld文章,其中详细解释了该文章:
[http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html]
交换两个基元将永远无法进行,因为在Java中基元是通过值传递的。 您甚至无法编写一种方法来交换两个对象。
就像@Thomas所说的那样,您唯一可以做的就是将您的原语包含在其他对象/数组中并对其进行修改。
Brent Writes Code answered 2020-02-09T17:27:59Z
7 votes
一线适用于任何原始数字:
a += (b - (b = a));
Oleg Mikhailov answered 2020-02-09T17:28:19Z
4 votes
您可以创建@marcus交换方法的通用版本,该方法可以交换任意数量的相同类型的对象:
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);
dansalmo answered 2020-02-09T17:28:40Z
2 votes
在java5中,我能想到的最有帮助的可能是:
AtomicInteger类(及其他类)具有getAndSet()原子方法..
KLE answered 2020-02-09T17:29:04Z
2 votes
要编写交换原语的交换方法,您必须具有“输出”变量的概念,即其值将传递到调用上下文的变量。 C#有这些,但是您仍然必须指定它们是变量。
Michael Wiles answered 2020-02-09T17:29:24Z
1 votes
该函数将交换两个整数
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
Fadi Hatem answered 2020-02-09T17:29:45Z
1 votes
这是交换两个原始变量的方法
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;
}
}
再说一次,我看不到有什么用
wonderer answered 2020-02-09T17:30:18Z
1 votes
我已经阅读了上面的答案,以寻求解释为什么不能以Java编写C ++的方式编写交换程序的原因。 我做了以下方式程序截图
Rohan Dwivedi answered 2020-02-09T17:30:38Z
0 votes
正如托马斯·欧文斯(Thomas Owens)所说。 您可能可以通过在C中通过&reference传递变量来做到这一点,但是afaik在Java中如果不使用对象就不行。
Chris Holland answered 2020-02-09T17:30:58Z
-1 votes
是的,可以使用一种方法交换两个变量。但是您应该使用空括号声明该方法,然后通过参考(空括号)。这是说明使用方法交换两个变量的示例。
公共类交换
{
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 =苹果
//在通过引用调用的情况下,如果我们在被调用方法中进行了更改,则原始值将被更改
Bobby Brahmam answered 2020-02-09T17:32:07Z
-4 votes
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);
}
}
Victor answered 2020-02-09T17:32:22Z