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

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

[cpp] view plaincopyprint?

  1. void swap(int&a ,int&b)
  2. {
  3. int temp;
  4. temp = a;
  5. a = b;
  6. b = temp;
  7. }

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

怎么办呢?

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

[java] view plaincopyprint?

  1. public static void swap(int[] data, int a, int b) {
  2. int t = data[a];
  3. data[a] = data[b];
  4. data[b] = t;
  5. }

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

[java] view plaincopyprint?

  1. //MyInteger: 与Integer有些类似,但是其对象可以变值
  2. class MyInteger {
  3. private int x;    // 将x作为唯一的数据成员
  4. public MyInteger(int xIn) { x = xIn; } // 构造器
  5. public int getValue() { return x; }  // 得到值
  6. public void insertValue(int xIn) { x = xIn;} // 改变值
  7. }
  8. public class Swapping {
  9. // swap: 传对象引用
  10. static void swap(MyInteger rWrap, MyInteger sWrap) {
  11. // 变值过程
  12. int t = rWrap.getValue();
  13. rWrap.insertValue(sWrap.getValue());
  14. sWrap.insertValue(t);
  15. }
  16. public static void main(String[] args) {
  17. int a = 23, b = 47;
  18. System.out.println("Before. a:" + a + ", b: " + b);
  19. MyInteger aWrap = new MyInteger(a);
  20. MyInteger bWrap = new MyInteger(b);
  21. swap(aWrap, bWrap);
  22. a = aWrap.getValue();
  23. b = bWrap.getValue();
  24. System.out.println("After.  a:" + a + ", b: " + b);
  25. }
  26. }

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

[java] view plaincopyprint?

  1. public class Swap2 {
  2. public static void main(String args[]){
  3. Swap2 sw = new Swap2(1,2);
  4. System.out.println("i is" + sw.i);
  5. System.out.println("j is" + sw.j);
  6. sw.swap();
  7. System.out.println("i is" + sw.i);
  8. System.out.println("j is" + sw.j);
  9. }
  10. int i,j;
  11. public Swap2(int i, int j){
  12. this.i = i;
  13. this.j = j;
  14. }
  15. public  void swap(){
  16. int temp;
  17. temp = i;
  18. i = j;
  19. j = temp;
  20. }
  21. }
  22. public class Swap1 {
  23. public static void Swap1(Integer a, Integer b){
  24. Integer temp = a;
  25. a = b;
  26. b = temp;
  27. }
  28. public  static  void main(String args[]){
  29. Integer a,b;
  30. a = new Integer(10);
  31. b = new Integer(20);
  32. Swap1.Swap1(a, b);
  33. System.out.println("a is " + a);
  34. System.out.println("b is " + b);
  35. }
  36. }

普及知识:

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

时间: 2024-10-21 21:01:57

Swap in JAVA, 不是想象中的简单的相关文章

【经历】苹果企业账号申请记录,比想象中要简单

经过十天左右,成功完成苹果的企业账号的申请,比想象中的要快些,但从流程上来看,其实可以更快的.第一次嘛,原谅自己吧,哈哈. 申请前需要确认的事情: Before applying, please ensure the following: 1.你公司计划发布内部App(发布到AppStore的不能用企业账号) Your organization plans to create and distribute iOS apps in-house. Enroll in the iOS Develope

科目一比想象中还要简单

考试很简单,过程却很费力. 驾校在管理上多多少少还是有点问题,把200多号人马扔在考场那里,也不说明一下考试流程,弄得很多人云里雾里(包括我). 8点半坐大巴上路,接近2小时才到考场:到了考场就等驾校人员点名,点到名的就可以步行云考室楼考试:但这点名环节明显有猫腻,有教练带去的,或者驾校里面的熟人的,肯定先考!无奈,教练没有来,只能靠上天眷顾,差不多12点的时候,终于被点到名,然后拿着准考证到考室楼,然后接着排队!!!!!! 大概12点40分终于排上号,轮到我考了,妈的. 阿sir叫我坐7号位,

show()封装没有想象中那么简单

以往写显示隐藏效果时,一般都习惯将display值设为none和block,隐藏是对的,就是display='none',但显示时我们一昧的display='block'会将行内元素变成块级元素,或许你不太在意,但这始终是不对的. 那么该怎么来判断在元素显示时给它的display值设为block还是inline还是inline-block呢,我的想法是在元素隐藏前将它的display值保存起来,然后在显示的时候再将这个值设置回去就可以了.问题解决了?no,这个方法只对一开始是显示的元素有用,如果

山竹”台风过后,发觉选择数据中心没有想象中那么简单了

超强台风"山竹"刚刚过去4天,香港地区在第一个工作日已陆续复产复业复市.有谁敢相信,"山竹"袭来的当天,香港天文台的10号风球信号整整挂足了10个小时. 根据香港中华电力当天新闻稿称,其供电系统在"山竹"的袭击下,40万伏特及13万2千伏特架空天线受到严重影响,导致约40000个客户供电中断.在这里新天域互联小编给大家做个小科普, 中华电力(中电)负责香港九龙.新界区的电力供应,而港灯电力(港灯)负责香港港岛地区的电力供给,双方分工分明.举个例子

刚刚完成了在vs2013中通过 ef连接mysql数据库的工作。感觉没有想象中的简单。试了n次终于成功。故记录成功的方法,希望可以帮到大家

分两种情况,如果你是用entity framework 5.0的时候 mysql-connector-net的版本不是很重要. MySQL For VisualStudio的版本也不重要 (这个不装就不能选择连mysql) 如果你是要用entity framework 6.0的时候就麻烦点了,mysql-connector-net用最新的mysql-connector-net 6.9.6(下载地址:http://cdn.mysql.com/Downloads/Connector-Net/mysq

比你想象中还要强大的枚举类型

开发中枚举类型往往被用在可以一一列举的实例中,比如 enum Color{red,green,blue;}.但是可能你不会注意到它的更强大之处,比如如下问题看看你能作答吗 1.枚举类型可以有构造函数吗? 2.枚举类型可以实现接口.继承类吗? 3.枚举类型可以有static成员变量和方法吗?以及可否有实例变量和方法吗? 4.枚举类型可以被继承吗? ..........等(打开eclipse一试便知的知识) 其实enum类型就是一个特殊的java类,它几乎具有一个java类所具有的大部分功能.它更类

【转载】Java基础之String中equals,声明方式,等大总结

转载请注明出处:http://blog.csdn.net/dmk877/article/details/49420141 无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识点还是比较多的.今天就和大家来一起讨论一下,关于String的一些容易让人疑惑的地方,废话不多说进入正题...如有谬误请批评指正,如果有疑问请留言.我会在第一时间修改或回答 通过

Java多态与C++中多态的实现

大牛的文章,值得拜读http://www.ibm.com/developerworks/cn/java/j-lo-polymorph/ 粘贴过来好多图片丢失了 /(ㄒoㄒ)/~~ 众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持到底是如何实现的呢,本文对此做了全面的介绍. 注意到在本文中,指针和引用会互换使用,它们仅是一个抽象概念,表示和另一个对

VRML与JAVA在网络课件中交互运用分析

虚拟现实建模语言(Virtual Reality Modeling Language 即VRML)和Java语言都是 可执行的代码"技术,通过网络传输的只是一个很小的描述文件(指令性数据集),客户端通过本地的VRML浏览器.JAVA虚拟机交互地访问这些文件并解释执行.将Java与VRML结合,能够很好地实现网络多媒体课件技术:使用VRML进行场景构造,内嵌用Java编写的程序设计实现对象的编程行为.这使VRML在网上创建充满真实感的三维虚拟世界,为用户提供一种自然的.身临其境的体验方式,包括交互