Обтекание строки после ряда символов по словам в 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

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

6 ответов

Решение

Вы можете использовать Apache-common's WordUtils.wrap ().

Использование 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.

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

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)

Я знаю, что это старый вопрос, но.,, На основании другого ответа я нашел здесь, но не могу вспомнить название постеров. Слава ему / ей за указание мне в правильном направлении.

    public String truncate(final String content, final int lastIndex) {
        String result = "";
        String retResult = "";
        //Check for empty so we don't throw null pointer exception
        if (!TextUtils.isEmpty(content)) {
            result = content.substring(0, lastIndex);
            if (content.charAt(lastIndex) != ' ') {
                //Try the split, but catch OutOfBounds in case string is an
                //uninterrupted string with no spaces
                try {
                    result = result.substring(0, result.lastIndexOf(" "));
                } catch (StringIndexOutOfBoundsException e) {
                    //if no spaces, force a break
                    result = content.substring(0, lastIndex);
                }
                //See if we need to repeat the process again
                if (content.length() - result.length() > lastIndex) {
                    retResult = truncate(content.substring(result.length(), content.length()), lastIndex);
                } else {
                    return result.concat("\n").concat(content.substring(result.length(), content.length()));
                }
            }
            //Return the result concatenating a newline character on the end
            return result.concat("\n").concat(retResult);;
            //May need to use this depending on your app
            //return result.concat("\r\n").concat(retResult);;
        } else {
            return content;
        }
    }

"\n" делает перенос слов.

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

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

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();
                    }
                }
            }
         }
     }

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

Другие вопросы по тегам