是否可以在Java中编写swap方法?

时间:2009-09-01 15:42:03

标签: java swap primitive-types

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

13 个答案:

答案 0 :(得分:48)

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

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

你可以这样做:

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

答案 1 :(得分:45)

如果不使用数组或对象,则不能在方法中执行此操作。

答案 2 :(得分:18)

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

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

两个原语的交换永远不会起作用,因为原语是通过Java中的值传递的。你甚至无法编写一个方法来交换两个对象。

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

答案 3 :(得分:6)

任何原始数字的单行:

private MediaScannerConnectionClient mediaScannerConnectionClient = new MediaScannerConnectionClient() {

    @Override
    public void onMediaScannerConnected() {
        mediaScannerConnection.scanFile("pathToFile/someName.extension", null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals("pathToFile/someName.extension"))
            mediaScannerConnection.disconnect();
    }
};
MediaScannerConnection mediaScannerConnection = new MediaScannerConnection(context, mediaScannerConnectionClient).connect();

答案 4 :(得分:3)

您可以制作@ marcus交换方法的通用版本,交换任意数量的相同类型的对象:

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

答案 5 :(得分:2)

  

在java5中,我能想到的最接近的可能是:

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

答案 6 :(得分:2)

要编写交换基元的交换方法,您必须具有“out”变量的概念,即其值传递到调用上下文的变量。 C#有那些,但你必须指出它们是变量。

答案 7 :(得分:1)

此功能将交换两个整数

Integer[] swap(int a, int b){
    return new Integer[]{b,a};
}

答案 8 :(得分: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;
    }
}

但是,我再也看不出这可能是什么用途

答案 9 :(得分:1)

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

答案 10 :(得分:0)

正如托马斯欧文斯所说。您可以通过&amp; reference传递变量来在C中完成它,但如果不使用对象,则不在Java中。

答案 11 :(得分:-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 = Apple

B = Bat

交换后

A = Bat

B = Apple

//如果我们在被调用的方法中进行了更改

,则在通过引用进行调用的情况下会更改原始值

答案 12 :(得分:-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);
    }    
}