A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

首先下面是我自己定义一个字符串反转功能,但是结果出现如下问题
反转前:   String s = "  djjj aaaa   ";
运行代码输入结果为:aaaa jjjd [C@1fb8ee3
不知道哪里出问题了,求大神解释,谢谢!!
代码如下:
class StringTest1
{
        public static void main(String[] args)
        {
                String s = "  djjj aaaa   ";
                sop(myReserve(s));
        }
        public static String myReserve(String str)
        {
                //将字符串变成数组。
                char[] chs = str.toCharArray();
                //对数组进行反转
                for (int start = 0,end=chs.length-1;start<chs.length&&start<end ;start++,end-- )
                {       
                        char temp=chs[start];
                        chs[start]=chs[end];
                        chs[end]=temp;       
                }
                for(int start = 0;start<chs.length-1;start++)
                {
                        System.out.print(chs[start]);
                }
                //将反转后的数组转为字符串
                return chs.toString();
        }
        //打印功能
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

9 个回复

倒序浏览
反转结果输出后面多了     [C@1fb8ee3  怎么出现这种情况?
回复 使用道具 举报
1,首先看到 [C@1fb8ee3  可以说明的是 你输出时 把 数组的地址的哈希值输出了  ,那说明你的输出数据有错误。
2,你程序中输出语句就两个:  System.out.print(chs[start]);  System.out.println(obj);  ,根据程序分析出 第一个就是翻转后字符串数组  那么第二个就是输出 [C@1fb8ee3。
所以,你的函数sop()时错误的。
更改后的代码 :不是最优的,但可以帮助你解决问题。
  1. class StringTest1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s = "  djjj aaaa   ";
  6.                 //sop(myReserve(s));
  7.                 // System.out.print(myReserve(s));
  8.            String str = myReserve(s);
  9.         }
  10.         public static String myReserve(String str)
  11.         {
  12.                 //将字符串变成数组。
  13.                 char[] chs = str.toCharArray();
  14.                 //对数组进行反转
  15.                 for (int start = 0,end=chs.length-1;start<chs.length&&start<end ;start++,end-- )
  16.                 {        
  17.                         char temp=chs[start];
  18.                         chs[start]=chs[end];
  19.                         chs[end]=temp;        
  20.                 }
  21.                 for(int start = 0;start<chs.length-1;start++)
  22.                 {
  23.                         System.out.print(chs[start]);
  24.                 }
  25.                 //将反转后的数组转为字符串
  26.                 return chs.toString();
  27.         }
  28.         //打印功能
  29.        // public static void sop(Object obj)
  30.        // {
  31.         //        System.out.println(obj);
  32.       //  }
  33. }
复制代码


回复 使用道具 举报
  1. public static String myReserve(String str) {
  2.                 char[] chs = str.toCharArray();

  3.                 // 将start < chs.length && start < end 改为 start < end
  4.                 // 因为start < end成立的情况下,start < chs.length一定为true
  5.                 for (int start = 0, end = chs.length - 1; start < end; start++, end--) {
  6.                         char temp = chs[start];
  7.                         chs[start] = chs[end];
  8.                         chs[end] = temp;
  9.                 }

  10.                 // 把start < chs.length - 1改为start < chs.length
  11.                 // 你的代码少写了一个字符
  12.                 for (int start = 0; start < chs.length; start++) {
  13.                         // 这里打印的是反转后的字符串,如果只需要反转后的字符串就只需要这两行代码就可以了
  14.                         System.out.print(chs[start]);
  15.                 }

  16.                 // 这里返回的是字符数组的内存地址,你在主函数中打印了这个内存地址
  17.                 return chs.toString();
  18.         }
复制代码

比较好的方法,用StringBuilder类可以解决这个问题
  1. public static void main(String[] args) {
  2.                 StringBuilder sb = new StringBuilder("  djjj aaaa   ");
  3.                 System.out.println(sb.reverse());
  4.         }
复制代码



回复 使用道具 举报
lurenge 发表于 2015-4-7 11:01
1,首先看到 [C@1fb8ee3  可以说明的是 你输出时 把 数组的地址的哈希值输出了  ,那说明你的输出数据有错误 ...

哈哈,谢谢,试过可以!是不是我画蛇添足多写了一个输出语句呢?直接调用myReserve(s);就可以了呢?
回复 使用道具 举报
是的,关键是要理解代码意思。其实你的函数myReserve()不用定义成String ,直接在主函数调用就行了。
回复 使用道具 举报
weiwei10153 发表于 2015-4-7 11:11
比较好的方法,用StringBuilder类可以解决这个问题

啊,谢谢,的确,写代码时候没用脑:lol多了一句废话。
回复 使用道具 举报
weiwei10153 发表于 2015-4-7 11:11
比较好的方法,用StringBuilder类可以解决这个问题

第20行代码换成  return new String(chs);就不会出现上面的打印结果为什么?
回复 使用道具 举报
silencelj 发表于 2015-4-7 12:37
第20行代码换成  return new String(chs);就不会出现上面的打印结果为什么?

没有看懂你表达是什么意思?

new String(char[] ch);  // 它返回的是String对象,它表示当前包含的字符数组参数字符序列,简单说就是将字符数组重新组合为字符串然后进行返回,打印的是字符串的内容
chs.toString();       // 它是把字符数组在内存的存储地址进行返回,打印的是存储的地址
回复 使用道具 举报
weiwei10153 发表于 2015-4-7 18:22
没有看懂你表达是什么意思?

new String(char[] ch);  // 它返回的是String对象,它表示当前包含的字符数 ...

chs.toString();  打印出的是地址好吧,好像是这样的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马