【发布时间】:2010-11-24 16:37:36
【问题描述】:
问题来了:编写一个交换两个变量的方法。这两个变量应该是原语。它不需要是通用的,例如两个int 变量。有办法吗?!
【问题讨论】:
-
检查一下。有关交换的更多信息,请参阅。 cs.utsa.edu/~wagner/CS2213/swap/swap.html 看看这个。更多信息交换参考。
标签: java swap primitive-types
问题来了:编写一个交换两个变量的方法。这两个变量应该是原语。它不需要是通用的,例如两个int 变量。有办法吗?!
【问题讨论】:
标签: java swap primitive-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 的原始值经过评估,以便作为第一个参数传递给函数b = a,并将结果(b 的新值)作为第二个参数传递给函数b 的原始值并忽略它的新值a
如果returnFirst 太长,您可以选择一个较短的名称以使代码更紧凑(例如a = sw(b, b = a))。用它来打动你的朋友并迷惑你的敌人:-)
【讨论】:
_,那么你几乎可以写成a=b;b=a;。看看它看起来有多干净(?):a=_(b,b=a);
不使用数组或对象,不,不可能在方法中做到这一点。
【讨论】:
查看详细解释它的这篇 JavaWorld 文章:
http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
两个原语的交换永远不会起作用,因为在 Java 中原语是按值传递的。为此,您甚至不能编写交换两个对象的方法。
就像@Thomas 所说,您唯一能做的就是将您的原语包含在其他对象/数组中并修改它们。
【讨论】:
任何原始数字的单线:
a += (b - (b = a));
【讨论】:
您可以创建一个通用版本的 @marcus 的 swap 方法来交换任意数量的相同类型的对象:
<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);
【讨论】:
rotate 函数来处理未指定数量的对象。
在 java5 中,我能想到的最接近的可能对您有所帮助的是:
AtomicInteger 类(和其他类)具有getAndSet() 原子方法..
【讨论】:
要编写交换原语的交换方法,您必须具有“输出”变量的概念,即其值被传递给调用上下文的变量。 C# 有这些,但您仍然必须指定它们是变量。
【讨论】:
这个函数将交换两个整数
Integer[] swap(int a, int b){
return new Integer[]{b,a};
}
【讨论】:
这是一个交换两个原始变量的方法
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;
}
}
再一次,我看不出这有什么用处
【讨论】:
我已阅读上述答案,以寻求解释为什么说交换程序不能像用 c++ 编写的那样用 java 编写。 我做了以下方式 program screenshot
【讨论】:
正如托马斯·欧文斯所说。您可能可以在 C 中通过 &reference 传递变量来做到这一点,但在 Java 中不使用对象就不行。
【讨论】:
是的,可以使用一种方法交换两个变量。 但是你应该用空括号声明该方法,然后调用它 参考(空括号)。 这是一个示例,说明使用方法交换两个变量。
公共类交换
{
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);
}
}
【讨论】: