黑马程序员技术交流社区
标题:
stringBuilder的遍历问题。
[打印本页]
作者:
杨玲
时间:
2013-3-1 00:28
标题:
stringBuilder的遍历问题。
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);
}
}
复制代码
作者:
lzw123451
时间:
2013-3-1 00:57
class InnerTest
{
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < 10 ; i++)
{
sb.append("abcd");
}
int length = sb.length();
System.out.println(length);
for(int i = 0 ; i <length ; i++) //sb.length()获取sb的长度, 当你在下面删除元素的时候,这个长度会变短的,当你删除20个,sb.length()就=20,所以就停止了。
{
//这里只能遍历到一半的样子,测试发现i到20循环就结束了。求原理!
System.out.println(sb.length()+"...."+i+"...."+length);
sb.deleteCharAt(0); //这里要删除索引为0的字符,一直删第一个就可以了,因为你删了,它还会从后面补回来。如果用i,也会出现上面类似的问题。
}
}
}真确代码时这样的
复制代码
上面两个条件要同时成立。
作者:
Benwolf0818
时间:
2013-3-1 01:02
本帖最后由 崔芝鲁 于 2013-3-1 01:05 编辑
这个可谓经典的遍历删除问题
<div class="blockcode"><blockquote>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.length的值
}
}
复制代码
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);
}
}
作者:
夏振博
时间:
2013-3-1 01:04
sb.deleteCharAt(i);这里的问题,你循环一次删一个,这个stringBuilder开始的长度为40,循环20次就是删了20次,stringBuilder长度此时为20,此时int i 的变量也在增加到19
下次循环时 i ++等于20,此时stringBuilder长度为20 ,此时for()循环条件已经不成立了。所以就....你懂得
作者:
李俊伟
时间:
2013-3-1 01:24
本帖最后由 李俊伟 于 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),循环结束。
*
* */
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2