【问题标题】:Is it possible to write swap method in Java? [duplicate]是否可以在 Java 中编写交换方法? [复制]
【发布时间】:2010-11-24 16:37:36
【问题描述】:

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

【问题讨论】:

标签: java swap primitive-types


【解决方案1】:

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

  • 只使用一个语句交换两个变量
  • 调用者代码中没有临时变量
  • 没有“装箱”基元
  • 有一些重载(其中一个使用泛型),它适用于任何类型

你可以这样做:

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))。用它来打动你的朋友并迷惑你的敌人:-)

【讨论】:

  • 如果你将你的函数命名为_,那么你几乎可以写成a=b;b=a;。看看它看起来有多干净(?):a=_(b,b=a);
  • 哎呀,_ 在 Java 8 中已被弃用为标识符,并且可以在 Java 9 中删除。不确定他们将使用它做什么。
  • 这太糟糕了,不可读,谁愿意这样做?
  • 我认为这应该是一个公认的答案!很棒(但是是的,完全不切实际)
  • @marcus 我认为不鼓励使用 _ 作为标识符,因为 java 8(编译器可能会显示警告)是不允许的,但使用 _ 作为 Lambda 的标识符会显示编译时错误。
【解决方案2】:

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

【讨论】:

  • 顺便说一句,数组是对象,所以你真的只需要说对象。来自 java.sun.com:“数组是一个容器对象,它包含固定数量的单一类型值。”我知道很挑剔:)
  • 那么如何使用数组或对象呢?这些数组或对象没有在方法中使用吗?它们是全球性的吗?或者可以使用本地数组或对象交换方法内的对象吗?
  • @geowa4 我认为向新手介绍数组是一个对象是可以的。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    任何原始数字的单线:

    a += (b - (b = a));
    

    【讨论】:

      【解决方案5】:

      您可以创建一个通用版本的 @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);
      

      【讨论】:

      • 可变参数函数将创建一个临时数组 (Object[]) 来传递所有对象。我不确定 JIT 在运行时会如何表现,但是创建一个数组来交换两个值看起来有点浪费,除非你真的需要一个 rotate 函数来处理未指定数量的对象。
      • 对于固定数量的值,您可以这样做without the array
      【解决方案6】:

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

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

      【讨论】:

      • 这个问题专门针对原始类型。这些是对象。
      • @Thomas: "应该是原语"
      • @Thomas 好的。那我一点头绪都没有。 @geowa4 感谢您的支持 :-)
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        这个函数将交换两个整数

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

        【讨论】:

          【解决方案9】:

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

          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】:

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

          【讨论】:

            【解决方案11】:

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

            【讨论】:

              【解决方案12】:

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

              公共类交换

              {

              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】:
              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);
                  }    
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-03-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多