是否可以在Java中编写交换方法?
这里是一个问题:写一个交换两个variables的方法。 这两个variables应该是原始的。 它不需要是通用的,例如两个int
variables。 有没有办法?
不使用数组或对象,不,不可能在一个方法内完成。
虽然不可能编写一个简单地交换两个variables的函数,但可以编写一个辅助函数 ,使您可以:
- 只用一个语句交换两个variables
- 在调用者的代码中没有临时variables
- 没有“拳击”原语
- 有一些重载(其中一个使用generics), 它适用于任何types
这就是你如何做到这一点:
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节)所有参数都是从左到右进行评估的(不同于其他评估顺序未定义的其他语言),所以执行顺序是:
- 评估
b
的原始值是为了作为第一个parameter passing给函数 - 评估expression式
b = a
,并将结果(b
的新值)作为第二个parameter passing给函数 - 该函数执行,返回
b
的原始值并忽略其新值 - 您将结果分配给
a
如果returnFirst
太长,可以select一个较短的名称来使代码更紧凑(例如a = sw(b, b = a)
)。 用这个打动你的朋友,迷惑你的敌人:-)
查看这篇详细解释它的JavaWorld文章:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
两个原语的交换将不会工作,因为原语是通过Java中的值传递的。 你甚至不能写一个交换两个对象的方法。
像@Thomas说的那样,你唯一能做的就是把你的原语包含在其他对象/数组中并修改它们。
你可以使@ marcus的交换方法的通用版本交换任意数量的相同types的对象:
<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()
primefaces方法..
要编写一个交换原语的交换方法,你必须有“out”variables的概念,即variables的值传递给调用上下文。 C#有这些,但你仍然必须指定他们是变数。
单数的任何原始数字:
a += (b - (b = a));
这个函数将交换两个整数
Integer[] swap(int a, int b){ return new Integer[]{b,a}; }
这是一个交换两个原始variables的方法
private void swap(){ int a = 1; int b = 2; int temp = a; a = b; b = temp; }
虽然可能没有太大的用处;)
好的,如果variables是类的话,可以这样做:
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中。 我做了以下方式程序截图
正如托马斯·欧文斯所说。 你可以在C中通过&reference来传递variables,但不使用Java而不使用对象。
是的,可以使用方法交换两个variables。 但是你应该用空的括号声明该方法,然后通过引用(空括号)来调用它 。 这是一个例子,说明使用方法交换两个variables。
公共类交换
{
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); } }