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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨玲 中级黑马   /  2013-3-1 00:28  /  7582 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public static void main(String[] args)
  2.         {
  3.                 StringBuilder sb = new StringBuilder();
  4.                
  5.                 for(int i = 0 ; i < 10 ; i++)
  6.                 {
  7.                         sb.append("abcd");
  8.                 }
  9.                 //int length = sb.length();
  10.                 for(int i = 0 ; i <sb. length() ; i++)
  11.                 {
  12. //这里只能遍历到一半的样子,测试发现i到20循环就结束了。求原理!               
  13. System.out.println(sb.length()+"...."+i+"...."+length);
  14.                         sb.deleteCharAt(i);
  15.                 }
  16.         }
复制代码

4 个回复

倒序浏览
  1. class InnerTest
  2. {
  3. public static void main(String[] args)

  4. {

  5.         StringBuilder sb = new StringBuilder();

  6.         

  7.         for(int i = 0 ; i < 10 ; i++)

  8.         {

  9.                 sb.append("abcd");

  10.         }

  11.         int length = sb.length();
  12.         System.out.println(length);

  13.         for(int i = 0 ; i <length ; i++)                //sb.length()获取sb的长度, 当你在下面删除元素的时候,这个长度会变短的,当你删除20个,sb.length()就=20,所以就停止了。

  14.         {

  15. //这里只能遍历到一半的样子,测试发现i到20循环就结束了。求原理!               

  16. System.out.println(sb.length()+"...."+i+"...."+length);

  17.                 sb.deleteCharAt(0);                           //这里要删除索引为0的字符,一直删第一个就可以了,因为你删了,它还会从后面补回来。如果用i,也会出现上面类似的问题。

  18.         }

  19. }
  20. }真确代码时这样的
复制代码
上面两个条件要同时成立。

评分

参与人数 1黑马币 +90 收起 理由
杨玲 + 90 谢谢!

查看全部评分

回复 使用道具 举报
本帖最后由 崔芝鲁 于 2013-3-1 01:05 编辑

这个可谓经典的遍历删除问题
  1. <div class="blockcode"><blockquote>public static void main(String[] args)

  2.         {

  3.                 StringBuilder sb = new StringBuilder();

  4.                
  5.                 for(int i = 0 ; i < 10 ; i++)

  6.                 {

  7.                         sb.append("abcd");

  8.                 }

  9.                 //int length = sb.length();

  10.                 for(int i = 0 ; i <sb. length() ; i++)

  11.                 {

  12. //这里只能遍历到一半的样子,测试发现i到20循环就结束了。求原理!               
  13. System.out.println(sb.length()+"...."+i+"...."+length);

  14.                         sb.deleteCharAt(i);//此处删除元素直接改变了sb.length的值

  15.                 }

  16.         }
复制代码
public static void main(String[] args)

        {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 10; i++) {
                        sb.append("abcd");
                }
                 int length = sb.length();

                for (int i = 0; i < length; length--){
                        System.out.println(sb.length() + "...." + i );
                        sb.deleteCharAt(i);
                }

        }
回复 使用道具 举报
sb.deleteCharAt(i);这里的问题,你循环一次删一个,这个stringBuilder开始的长度为40,循环20次就是删了20次,stringBuilder长度此时为20,此时int i 的变量也在增加到19
下次循环时  i ++等于20,此时stringBuilder长度为20 ,此时for()循环条件已经不成立了。所以就....你懂得
回复 使用道具 举报
本帖最后由 李俊伟 于 2013-3-1 01:25 编辑

public class BaseTest6 {
public static void main(String[] args) {
               StringBuilder sb = new StringBuilder();         
            for(int i = 0 ; i < 10 ; i++) {
                       sb.append("abcd");
               }
               int length = sb.length();
               for(int i = 0 ; i <sb.length() ; i++){
                //这里只能遍历到一半的样子,测试发现i到20循环就结束了。求原理!               
                System.out.println(sb.length()+"...."+i+"...."+length);
                        sb.deleteCharAt(i);//当删除一个字符,sb的长度就减少1
               }
               /*
                * 分析:(1)当i = 0时,i<40(true),打印:40...0...40;sb.deleteCharAt(0);sb.length()=39;i++。
                * (2)i=1,1<39(true),打印:39...1...40;sb.deleteCharAt(1);sb.length()=38;i++。
                * (3)i=2,2<38(true),打印:38...2...40;sb.deleteCharAt(2);sb.length()=37;i++。
                *     .
                *     .
                *     .
                * (20)i=18,19<22(true),打印:22...18...40;sb.deleteCharAt(18);sb.length()=21;i++。
                * (20)i=19,19<21(true),打印:21...19...40;sb.deleteCharAt(19);sb.length()=20;i++。
                * (21)i=20,20<20(false),循环结束。
                *
                * */
         }
}

评分

参与人数 1黑马币 +30 收起 理由
杨玲 + 30 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马