2009-09-01 34 views
44

这是一个问题:写一个交换两个变量的方法。这两个变量应该是原始的。它不需要是通用的,例如两个int变量。有没有办法?是否可以在Java中编写交换方法?

+0

清洁香港由基准掉这个out.More信息。 http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html Chk this out.More info on swap by reference。 – 2012-06-28 07:27:41

回答

43

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

+2

btw,数组是对象,所以你只需要说对象。来自java.sun.com:“一个数组是一个容器对象,它拥有固定数量的单一类型的值。”被挑剔,我知道:) – geowa4 2009-09-01 16:00:30

+0

那么怎么可能通过使用数组或对象?这些数组或对象是否在方法内部不被使用?他们是全球吗?或者可以使用本地数组或对象在一个方法内交换对象? – c0d3Junk13 2012-03-21 19:50:11

+0

@ geowa4我认为可以同时向新来者介绍数组是一个对象。 – 2013-10-23 08:07:57

18

看看这个JavaWorld的文章,解释它的细节:

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

两个基本的交换行不通,因为原语是按值在Java中通过。你甚至不能写一个方法来交换两个对象。

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

2

在Java5的,我能想到的,它可以帮助你最接近的,就是:

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

+0

问题是关于原始类型的具体问题。这些是物体。 – 2009-09-01 15:49:39

+0

@Thomas:“**应该是原始的” – geowa4 2009-09-01 15:58:06

+0

@Thomas OK。那我没有线索。 @ geowa4感谢您的支持:-) – KLE 2009-09-01 16:17:00

0

正如托马斯·欧文斯说: 。你可以在C中通过&引用来传递变量,但afaik不使用Java而不使用对象。

2

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

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

此功能将交换两个整数

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

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

  • 交换两个使用只有一个语句变量
  • 没有临时变量在调用者的代码
  • 没有“拳击”
  • 少数重载(其中一人使用泛型),它适用于任何类型的

那怎么你可以这样做:

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 La nguage规范,Java SE 7版,第15.12.4节。2)所有的参数都从左至右(和其它语言不同,在那里计算的顺序是不确定的)来评价,所以该执行顺序是:

  1. b原始值,以便进行评估,以传递作为第一个参数的函数
  2. 表达b = a被评估,并且结果(b新值)作为第二个参数函数
  3. 功能执行被传递,返回的b原始值,而忽略其新值
  4. 你assi GN的结果a

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

+1

如果您将函数命名为'_',那么您可以**几乎**写入**'a = b; b = a;'**。看看它看起来如何干净(?):**'a = _(b,b = a);'** – marcus 2013-05-30 21:51:48

+2

Ouch,_在Java 8中被弃用作为标识符,并且可以在Java 9中删除。不确定它们是什么将要使用它。 – marcus 2014-10-26 00:09:05

+0

这是可怕的和不可读的,谁会想要这样做? – maazza 2016-01-11 11:04:04

3

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

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

可变参数函数将创建一个临时数组(Object [])来传递所有的对象。我不确定JIT如何在运行时表现出来,但创建一个交换两个值的数组看起来有点浪费,除非你确实需要一个'rotate'函数来处理一个不确定数量的对象。 – marcus 2014-02-04 12:19:49

+0

对于固定数量的值,您可以[无数组](http:// stackoverflow。COM /问题/ 2393906 /怎么办 - 我 - 让 - 我的交换功能,在的Java/20600020#20600020)。 – dansalmo 2014-02-04 16:07:36

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

再次,虽然,我看不到有什么用的,这可能是

+0

这回答了书面的问题 - 为什么downvote? – wonderer 2014-03-04 17:05:52

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

//在通过引用原始值的情况下调用的,如果我们作出所调用的方法

变化改变
+0

这是一种交换类中两个变量值的方法,而不是作为参数传递的两个变量。调用不带参数的方法不是通过引用调用方法。 – 2018-02-27 08:06:48

1

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

3

任何原始数字的一行:

a += (b - (b = a)); 
相关问题