53

这是问题:编写一个交换两个变量的方法。这两个变量应该是原语。它不需要是通用的,例如两个int变量。有办法吗?!

4

13 回答 13

56

虽然不可能编写一个简单地交换两个变量的函数,但可以编写一个帮助函数,它允许您:

  • 仅使用一条语句交换两个变量
  • 调用者代码中没有临时变量
  • 没有“拳击”原语
  • 通过一些重载(其中一个使用泛型),它适用于任何类型

你可以这样做:

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

  1. 的原始值b被评估以便作为第一个参数传递给函数
  2. 计算表达式b = a,并将结果(的新值b)作为第二个参数传递给函数
  3. 函数执行,返回原始值b并忽略其新值
  4. 您将结果分配给a

如果returnFirst太长,您可以选择一个较短的名称以使代码更紧凑(例如a = sw(b, b = a))。用它来打动你的朋友并迷惑你的敌人:-)

于 2013-05-30T00:59:06.967 回答
49

如果不使用数组或对象,不,不可能在方法中做到这一点。

于 2009-09-01T15:44:20.460 回答
18

查看这篇 JavaWorld 文章,它详细解释了它:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

两个原语的交换永远不会起作用,因为在 Java 中原语是按值传递的。为此,您甚至不能编写交换两个对象的方法。

就像@Thomas 所说,您唯一能做的就是将您的原语包含在其他对象/数组中并修改它们。

于 2009-09-01T15:48:18.550 回答
13

任何原始数字的单行:

a += (b - (b = a));
于 2016-05-17T13:24:30.887 回答
4

您可以制作@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);
于 2013-12-15T21:52:25.770 回答
2

要编写交换原语的交换方法,您必须具有“输出”变量的概念,即其值被传递给调用上下文的变量。C# 有这些,但您仍然必须指定它们是变量。

于 2009-09-01T15:53:10.397 回答
2

在 java5 中,我能想到的最接近的可能对您有所帮助的是:

AtomicInteger 类(和其他类)具有getAndSet()原子方法..

于 2009-09-01T15:48:59.657 回答
1

这是交换两个原始变量的方法

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;
    }
}

尽管如此,我还是看不到它的用途是什么

于 2014-03-04T12:05:56.937 回答
1

此函数将交换两个整数

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}
于 2013-05-09T13:56:18.343 回答
1

我已经阅读了上述答案,以寻求解释为什么说交换程序不能像用 c++ 编写的那样用 java 编写。我做了以下方式 程序截图

于 2016-01-18T09:37:34.820 回答
0

正如托马斯欧文斯所说。您可能可以在 C 中通过 &reference 传递变量来做到这一点,但在 Java 中不使用对象就不行。

于 2009-09-01T15:51:16.937 回答
-1

是的,可以使用一种方法交换两个变量。 但是您应该用空括号声明该方法,然后通过引用(空括号)调用它。这是一个示例,说明使用方法交换两个变量。

公共课交换

{

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=苹果

//如果我们在被调用的方法中进行了更改,则通过引用调用原始值被更改

于 2015-10-01T15:05:15.147 回答
-4
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);
    }    
}
于 2012-10-15T17:22:20.170 回答