您的位置:首页 > 编程语言 > Java开发

Swap in JAVA, 不是想象中的简单

2012-12-10 18:07 218 查看


Swap in JAVA, 不是想象中的简单

分类: JAVA(J2SE)2011-06-30
19:38 527人阅读 评论(0) 收藏 举报

个程序员都知道,在C/C++里面交换值的方法:

[cpp] view
plaincopyprint?

void swap(int&a ,int&b)  

{  

    int temp;  

    temp = a;  

    a = b;  

    b = temp;  

}  

但在JAVA中用这种方法是行不通的,因为“Java对普通类型的变量是不支持引用传递的”。

怎么办呢?

 

1. 可以像下面这样通过传数组(也属于传值)的方法来完成对换(在很多排序算法里面就是这么干的):

[java] view
plaincopyprint?

public static void swap(int[] data, int a, int b) {  

        int t = data[a];  

        data[a] = data;  

        data[b] = t;  

    }  

 

2. 也可以通过重新定义个类(在JAVA中我们可以通过使用int的包装类---Integer,然后将其作为值的引用传到函数中,但这个Integer包装类也不允许你来改变它的数据域;但这不防碍我们[b]用自己的包装类
,比如说下面实现的MyInteger):

[java] view
plaincopyprint?

//MyInteger: 与Integer有些类似,但是其对象可以变值  

class MyInteger {     

    private int x;    // 将x作为唯一的数据成员   

    public MyInteger(int xIn) { x = xIn; } // 构造器   

    public int getValue() { return x; }  // 得到值    

    public void insertValue(int xIn) { x = xIn;} // 改变值  

}  

  

public class Swapping {     

    // swap: 传对象引用   

    static void swap(MyInteger rWrap, MyInteger sWrap) {        

        // 变值过程       

        int t = rWrap.getValue();        

        rWrap.insertValue(sWrap.getValue());        

        sWrap.insertValue(t);     

    }     

    public static void main(String[] args) {        

        int a = 23, b = 47;        

        System.out.println("Before. a:" + a + ", b: " + b);        

        MyInteger aWrap = new MyInteger(a);        

        MyInteger bWrap = new MyInteger(b);        

        swap(aWrap, bWrap);        

        a = aWrap.getValue();        

        b = bWrap.getValue();        

        System.out.println("After.  a:" + a + ", b: " + b);     

    }  

}  

 

3. 由于java 中的参数传递都是采用的值传递方式,这不防碍我们用swap的时候采用外部内联的方式:

[java] view
plaincopyprint?

public class Swap2 {   

    public static void main(String args[]){   

        Swap2 sw = new Swap2(1,2);   

        System.out.println("i is" + sw.i);   

        System.out.println("j is" + sw.j);   

        sw.swap();   

        System.out.println("i is" + sw.i);   

        System.out.println("j is" + sw.j);   

    }   

    int i,j;   

    public Swap2(int i, int j){   

        this.i = i;   

        this.j = j;   

    }   

  

    public  void swap(){   

        int temp;   

        temp = i;   

        i = j;   

        j = temp;   

    }   

}   

  

public class Swap1 {   

    public static void Swap1(Integer a, Integer b){   

        Integer temp = a;   

        a = b;   

        b = temp;   

    }   

    public  static  void main(String args[]){   

        Integer a,b;   

        a = new Integer(10);   

        b = new Integer(20);   

        Swap1.Swap1(a, b);   

        System.out.println("a is " + a);   

        System.out.println("b is " + b);   

    }   

}   

 

普及知识:

Java是传值还是传引用:http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html

在C/C++/JAVA中实现swap:http://www.cs.utsa.edu/~wagner/CS2213/swap/swap.html

 

 

 

参考:

http://wzdoxu.iteye.com/blog/251988

http://hi.baidu.com/aleczhou/blog/item/975ad262391313d9e7113aa0.html

分享到: 

上一篇:一位高手的web测试总结下一篇:最近关于排序算法的 一些笔记
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: