Оберните строку после нескольких слов по-разному в Java

У меня есть этот код:

    String s = "A very long string containing " +
                   "many many words and characters. " +
                   "Newlines will be entered at spaces.";

    StringBuilder sb = new StringBuilder(s);

    int i = 0;
    while ((i = sb.indexOf(" ", i + 20)) != -1) {
        sb.replace(i, i + 1, "\n");
    }

    System.out.println(sb.toString());

Вывод кода:

A very long string containing
many many words and
characters. Newlines
will be entered at spaces.

Вышеприведенный код обертывает строку после следующего пробела каждые 30 символов, но мне нужно обернуть строку после предыдущего пространства каждые 30 символов, например, для первой строки:

A very long string

И вторая строка будет

containing many

Пожалуйста, дайте правильное решение.

Ответ 2

Используйте lastIndexOf вместо indexOf, например

StringBuilder sb = new StringBuilder(s);

int i = 0;
while (i + 20 < sb.length() && (i = sb.lastIndexOf(" ", i + 20)) != -1) {
    sb.replace(i, i + 1, "\n");
}

System.out.println(sb.toString());

Это приведет к следующему выводу:

A very long string
containing many
many words and
characters.
Newlines will be
entered at spaces.

Ответ 3

Вы можете попробовать следующее:

public static String wrapString(String s, String deliminator, int length) {
    String result = "";
    int lastdelimPos = 0;
    for (String token : s.split(" ", -1)) {
        if (result.length() - lastdelimPos + token.length() > length) {
            result = result + deliminator + token;
            lastdelimPos = result.length() + 1;
        }
        else {
            result += (result.isEmpty() ? "" : " ") + token;
        }
    }
    return result;
}

вызывать как wrapString ( "asd xyz afz", "\n", 5)

Ответ 4

"\n" делает wordwrap.

String s = "A very long string containing \n" +  
"many many words and characters. \n" +
"Newlines will be entered at spaces.";

это решит вашу проблему.

Ответ 5

public static void main(String args[]) {

         String s1="This is my world. This has to be broken.";
         StringBuffer buffer=new StringBuffer();

         int length=s1.length();
         int thrshld=5; //this valueis threshold , which you can use 
         int a=length/thrshld;

         if (a<=1) {
             System.out.println(s1);
         }else{
            String split[]=s1.split(" ");
            for (int j = 0; j < split.length; j++) {
                buffer.append(split[j]+" "); 

                if (buffer.length()>=thrshld) { 

                    int lastindex=buffer.lastIndexOf(" ");

                    if (lastindex<buffer.length()) { 

                        buffer.subSequence(lastindex, buffer.length()-1);
                        System.out.println(buffer.toString()); 
                        buffer=null;
                        buffer=new StringBuffer();
                    }
                }
            }
         }
     }

Это может быть один из способов достижения