插入for循环失败

时间:2015-11-19 20:21:50

标签: java stringbuilder

我正在尝试在for循环中插入一个Stringbuilder,但它崩溃了。这是我的代码

StringBuilder sb = new StringBuilder("This is a text");
for(int i = 0;i < sb.length();i++){
    if(sb.charAt(i) == 't'){
        sb.insert(i, 't');
    }
}

这样做的目的是使每个't'加倍。

4 个答案:

答案 0 :(得分:7)

您收到了OutOfMemoryError,因为您没有跳过加倍的t字符。

This is a text
          ^
This is a ttext
           ^
This is a tttext
            ^

这一直持续到你内存不足为止。

您必须在插入加倍t之后通过递增i来跳过刚刚添加的t

if (sb.charAt(i) == 't')
{
    sb.insert(i, 't');
    i++;
}

答案 1 :(得分:1)

我建议使用StringBuilder和这样的字符串:

String currentText = "This is a text";
StringBuilder sb = new StringBuilder();
for(int i = 0; i < currentText.length(); i++){
    sb.append(currentText.charAt(i));
    if(currentText.charAt(i) == 't'){
        sb.append('t');
    }
}

使用该解决方案,您将不会遇到永无止境的循环问题。

答案 2 :(得分:0)

您遇到的问题如下:

  1. 从头到尾遍历列表。
  2. 如果您发现t添加t
  3. 两种情况,t中至少有1 String或者没有t。如果没有,那么一切都会起作用,代码什么都不做。但是,如果有t它会发现t添加另一个t,则要检查的下一个字符现在是...... i!无限循环。

    您可以通过递增ì++continue)或使用TABLE_NAME = 'Test' sql = sqlite3.connect('DATABASE.db') cur = sql.cursor() cur.execute('CREATE TABLE IF NOT EXISTS ? (id TEXT)', [TABLE_NAME]) sql.commit() 来解决此问题。

答案 3 :(得分:0)

因为当你发现t这条指令sb.insert(i, 't')时,t位置i,而t就位i+1,所以当ifor循环结束时i++t一起递增时,您会再次使用相同的字母i进行处理。这将导致无限循环。

要解决此问题,您应该在i++块中使用if增加if(sb.charAt(i) == 't'){ sb.insert(i, 't'); i++; } ,如下所示:

public class Main {
    package com.omt.mouse;

    import java.awt.Robot;
    import java.awt.event.InputEvent;
    public void mousePressed(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            mouseDown = true;
        }
    }


    public void mouseReleased(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            mouseDown = false;
        }
    }

    public static void main(String[] args) {

        Robot robot = new Robot();
        num = 0;
        while (true) {
            if (mouseDown) {
                if (num == 2000) {
                    robot.mousePress(InputEvent.BUTTON1_MASK);
                } else {
                    num++;
                }
            } else if (num == 2000) {
                num = 0;
                robot.mouseRelease(InputEvent.BUTTON1_MASK);
            }
        }

    }
}