嗨,我一直在努力研究这种简单的方法。

目标:是在提供的宽度之后创建新行。例如。如果宽度为20,则表示15个字符后创建新行。虽然有Wordwrap.Utils可以实现。我想手动执行此操作。

问题:但是,输出正在运行,如果句子中的单词超过15个字符,则会将其切掉并创建新行。例如。
Hi my name is Jimmy and I love programming.

如您所见,“吉米”一词被砍掉了。

问题:如果单词使句子超过15个字符,我如何确保在单词之前创建新行而不是将其砍掉?因此输出变为:

Hi my name isJimmy and Iloveprogramming.

该类如下:

public class Test {

public static void main(String[] args){

    String txt = "Hi my name is Jimmy and I love programming.";
    int width = 15;

    System.out.println(lineLength(txt, width));

}

public static String lineLength(String str, int width) {
    StringBuilder sb = new StringBuilder();

    while(true) {
        if(str.length() <= width) {
            sb.append(str);
            break;
        }

        sb.append(str.substring(0, width));
        sb.append("\n");
        str = str.substring(width);
    }

    return sb.toString();
}
}

最佳答案

代码的问题在于,您没有跟踪单词中断。对您的程序稍作更改,它将寻找最接近的空格,以使空格的位置不会超出您要查找的单词的长度。

    public static String lineLength(String str, int width) {
    StringBuilder sb = new StringBuilder();

    while (true) {
        if (str.length() <= width) {
            sb.append(str);
            break;
        }

        int cutOff = 0;
        int temp = 0;
        while(((temp = str.indexOf(" ", ++temp)) < width) && (temp >= 0))
        {
            cutOff = temp;
        }

        //Extra check in case the word itself is longer than the wrap
        if(cutOff == 0)
        {
            sb.append(str);
            return sb.toString();
        }
        String newString = str.substring(0, cutOff);

        sb.append(newString);
        sb.append("\n");
        str = str.substring(cutOff);
    }

    return sb.toString();
}

10-07 13:18