黑马程序员技术交流社区

标题: 实现数组反转出现的小错误 [打印本页]

作者: NewDemo    时间: 2014-4-15 00:09
标题: 实现数组反转出现的小错误
本帖最后由 NewDemo 于 2014-4-15 19:22 编辑

实现数组的反转,首先是错误代码
  1. public class Test1
  2. {

  3.         public static void main(String[] args)
  4.         {
  5.                 char[] ch={'a','c','f','g','v','d','r'};
  6.                 sop(ch);
  7.                 re(ch);
  8.                 sop(ch);
  9.         }
  10.         public static void sop(char[]chR)//定义方法,打印数组
  11.         {
  12.                 System.out.print("(");
  13.                 for(int x=0;x<chR.length && x!=chR.length-1;x++)
  14.                 {
  15.                                 System.out.print(chR[x]+",");        
  16.                 }
  17.                 System.out.println(chR[chR.length-1]+")");
  18.         }
  19.         public static char[] re(char []chs)//定义方法,进行反转
  20.         {
  21.                 int start=0,end=chs.length-1;
  22.                 for(;start<end;start++,end--)
  23.                 {
  24.                         swap(chs[start],chs[end]);
  25.                 }
  26.                 return chs;
  27.         }
  28.         public static void swap(char ch1,char ch2)//定义方法,传进两个字符,进行换位操作。
  29.         {
  30.                 char temp;
  31.                 temp=ch1;
  32.                 ch1=ch2;
  33.                 ch2=temp;
  34.         }
  35. }
复制代码

错误的原因,调用swap()时确实传入了两个字符没错,但是执行的结果是swap()并未对原数组进行操作或修改,所以数组并未实现反转
接下来是正确的
  1. public class Test1
  2. {

  3.         public static void main(String[] args)
  4.         {
  5.                 char[] ch={'a','c','f','g','v','d','r'};
  6.                 sop(ch);
  7.                 re(ch);
  8.                 sop(ch);
  9.         }
  10.         public static void sop(char[]chR)//定义方法,打印数组
  11.         {
  12.                 System.out.print("(");
  13.                 for(int x=0;x<chR.length && x!=chR.length-1;x++)
  14.                 {
  15.                                 System.out.print(chR[x]+",");        
  16.                 }
  17.                 System.out.println(chR[chR.length-1]+")");
  18.         }
  19.         public static char[] re(char []chs)//定义方法,进行反转
  20.         {
  21.                 for(int start=0,end=chs.length-1;start<end;start++,end--)
  22.                 {
  23.                         swap(chs,start,end);
  24.                 }
  25.                 return chs;
  26.         }
  27.         public static void swap(char []chs,int x,int y)//定义方法,传进两个字符,进行换位操作。
  28.         {
  29.                 char temp;
  30.                 temp=chs[x];
  31.                 chs[x]=chs[y];
  32.                 chs[y]=temp;
  33.         }
  34. }
复制代码
很久之前的错误了,大牛们轻拍。。。



作者: 呆呆沙师妹    时间: 2014-4-15 09:03
第一个程序中,swap接收的两个参数实际是两个基本数据类型的变量,传入swap内进行交换的是两个变量的拷贝,在swap范围内进行了变量值的交换,随着swap方法的结束,这两个值被释放了,之前传的值并没有发生任何改变。

第二个程序中,swap接收的是chs数组的地址、两个角标的拷贝,但swap函数中,拷贝地址与原地址相同,共同指向一个数组对象,这时进行交换,改变的是拷贝地址指向数组中元素,当swap方法结束,这些拷贝值被释放了,chs和两个角标中存储的地址和值都没有发生任何改变,但是chs指向的数组中的元素却发生了改变。
作者: NewDemo    时间: 2014-4-15 12:05
呆呆沙师妹 发表于 2014-4-15 09:03
第一个程序中,swap接收的两个参数实际是两个基本数据类型的变量,传入swap内进行交换的是两个变量的拷贝, ...

好专业的解释,好腻害,学习ing
作者: ithmC4    时间: 2014-4-15 12:27
这不是C的经典SWAP么
作者: NewDemo    时间: 2014-4-15 12:48
ithmC4 发表于 2014-4-15 12:27
这不是C的经典SWAP么

:dizzy:没学过c。。
作者: 雀巢咖啡    时间: 2014-4-15 23:24
直接调用API类库中的reverse()方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2