代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

可以在Java中编写swap方法吗?[副本]

  •  54
  • Khaled Alshaya  · 技术社区  · 16 年前

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

    13 回复  |  直到 16 年前
        1
  •  45
  •   Thomas Owens    16 年前

    虽然不可能编写一个简单地交换两个变量的函数,但可以编写一个 辅助功能 这使您能够:

    • 使用以下方式交换两个变量 只有一个声明
    • 没有临时变量 在呼叫者的代码中
    • 没有“拳击”
    • 通过一些重载(其中一个使用泛型), 它适用于任何类型

    你可以这样做:

    int returnFirst(int x, int y) {
        return x;
    }
    <T> T returnFirst(T x, T y) {
        return x;
    }
    // other overloads as needed
    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 Edition,第15.12.4.2节)所有参数都是从左到右计算的(与某些其他语言不同,其中计算顺序未定义),因此执行顺序为:

    1. 原始价值 b 被求值,以便作为第一个参数传递给函数
    2. 表达 b = a 对其进行评估,并得出结果(新的值 b
    3. b 而忽略了它的新价值
    4. 您将结果分配给 a

    returnFirst 太长,您可以选择一个较短的名称来使代码更紧凑(例如。 a = sw(b, b = a) ).

    假设你需要一个接一个地交换许多不同类型的变量。通过使用returnFirst,不需要intAux、objAux等。在某处错误使用错误变量的风险较小,因为没有额外的变量(至少在调用者中)。

        2
  •  48
  •   marcus    11 年前

    不使用数组或对象,不,不可能在方法中完成。

        3
  •  18
  •   Brent Writes Code    16 年前

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

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

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

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

        4
  •  5
  •   Oleg Mikhailov    10 年前

    任何原始数都有一行:

    a += (b - (b = a));
    
        5
  •  3
  •   dansalmo    12 年前

    您可以创建@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);
    
        6
  •  2
  •   KLE rslite    16 年前

    getAndSet() 原子方法。。

        7
  •  2
  •   Michael Wiles    16 年前

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

        8
  •  1
  •   Fadi Hatem    13 年前

    此函数将交换两个整数

    Integer[] swap(int a, int b){
        return new Integer[]{b,a};
    }
    
        9
  •  1
  •   wonderer    12 年前

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

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

    不过,我还是看不出这有什么用

        10
  •  1
  •   Rohan    10 年前

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

        11
  •  0
  •   Chris Holland    16 年前

    正如托马斯·欧文斯所说。你可能可以在C中通过将变量传递给&引用,但恐怕在Java中不使用对象是不行的。

        12
  •  -1
  •   Bobby Brahmam    10 年前

    是的,可以使用方法交换两个变量。 但是,您应该用空括号声明该方法,然后通过以下方式调用它 . 下面是一个使用方法交换两个变量的示例。

    公共类交换

    {

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

    //在通过引用调用的情况下,如果我们对被调用的方法进行了更改,则原始值会发生变化

        13
  •  -4
  •   Mick MacCallum    13 年前
    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);
        }    
    }