Подтвердить что ты не робот

Ввод char в строку java для каждого N символов

У меня есть строка java, которая имеет переменную длину.

Мне нужно положить кусок "<br>" в строку, скажем, каждые 10 символов.

Например, это моя строка:

`this is my string which I need to modify...I love stackoverlow:)`

Как я могу получить эту строку?:

`this is my<br> string wh<br>ich I nee<br>d to modif<br>y...I love<br> stackover<br>flow:)`

Спасибо

4b9b3361

Ответ 1

Что-то вроде:

public static String insertPeriodically(
    String text, String insert, int period)
{
    StringBuilder builder = new StringBuilder(
         text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    String prefix = "";
    while (index < text.length())
    {
        // Don't put the insert in the very first iteration.
        // This is easier than appending it *after* each substring
        builder.append(prefix);
        prefix = insert;
        builder.append(text.substring(index, 
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}

Ответ 2

Try:

String s = // long string
s.replaceAll("(.{10})", "$1<br>");

РЕДАКТИРОВАТЬ: Вышеупомянутые работы... большую часть времени. Я играл с ним и сталкивался с проблемой: поскольку он строит шаблон по умолчанию, он останавливается на новых линиях. Чтобы обойти это, вы должны написать его по-другому.

public static String insert(String text, String insert, int period) {
    Pattern p = Pattern.compile("(.{" + period + "})", Pattern.DOTALL);
    Matcher m = p.matcher(text);
    return m.replaceAll("$1" + insert);
}

и проницательный читатель найдет другую проблему: вам придется избегать специальных символов регулярного выражения (например, "$ 1" ) в заменяющем тексте, или вы получите непредсказуемые результаты.

Мне также стало любопытно и сравнили эту версию с Джоном выше. Это медленнее на порядок (1000 замен на 60-килограммовом файле заняли 4,5 секунды с этим, 400 мс с его). За 4,5 секунды всего около 0,7 секунды было фактически построено Шаблон. Большая часть его была на совпадении/замене, поэтому она даже не подходила к такой оптимизации.

Я обычно предпочитаю менее многословные решения вещей. В конце концов, больше кода = больше потенциальных ошибок. Но в этом случае я должен признать, что версия Jon - это действительно наивная реализация (я имею в виду, что хороший способ) - значительно лучше.

Ответ 3

Если вы не против зависимости от сторонней библиотеки и не возражаете регулярные выражения:

import com.google.common.base.Joiner;

/**
 * Splits a string into N pieces separated by a delimiter.
 *
 * @param text The text to split.
 * @param delim The string to inject every N pieces.
 * @param period The number of pieces (N) to split the text.
 * @return The string split into pieces delimited by delim.
 */
public static String split( final String text, final String delim, final int period ) {
    final String[] split = text.split("(?<=\\G.{"+period+"})");
    return Joiner.on(delim).join(split);
}

Тогда:

split( "This is my string", "<br/>", 5 );  

Это не разделяет слова в пробелах, но вопрос, как указано, не запрашивает слово-обертку.

Ответ 4

Чтобы не прерывать слова...

Try:

    int wrapLength = 10;
    String wrapString = new String();

    String remainString = "The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog";

    while(remainString.length()>wrapLength){
        int lastIndex = remainString.lastIndexOf(" ", wrapLength);
        wrapString = wrapString.concat(remainString.substring(0, lastIndex));
        wrapString = wrapString.concat("\n");

        remainString = remainString.substring(lastIndex+1, remainString.length());
    }

    System.out.println(wrapString); 

Ответ 5

StringBuilder buf = new StringBuilder();

for (int i = 0; i < myString.length(); i += 10) {
    buf.append(myString.substring(i, i + 10);
    buf.append("\n");
}

Вы можете получить более эффективное, чем это, но я оставлю это как упражнение для читателя.

Ответ 6

Как насчет 1 метода разбиения строки на каждый N символов:

public static String[] split(String source, int n)
{
    List<String> results = new ArrayList<String>();

    int start = 0;
    int end = 10;

    while(end < source.length)
    {
        results.add(source.substring(start, end);
        start = end;
        end += 10;
    }

    return results.toArray(new String[results.size()]);
}

Затем другой способ вставить что-то после каждой части:

public static String insertAfterN(String source, int n, String toInsert)
{
    StringBuilder result = new StringBuilder();

    for(String piece : split(source, n))
    {
        result.append(piece);
        if(piece.length == n)
            result.append(toInsert);
    }

    return result.toString();
}

Ответ 7

Я тестировал это решение для граничных условий:

public String padded(String original, int interval, String separator) {
    String formatted = "";

    for(int i = 0; i < original.length(); i++) {
        if (i % interval == 0 && i > 0) {
            formatted += separator;
        }
        formatted += original.substring(i, i+1);
    }

    return formatted;
}

Позвонить с помощью:

padded("this is my string which I need to modify...I love stackoverflow:)", 10, "<br>");