java交换函数_是否可以用Java编写交换方法?

是否可以用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值