Ввод 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:)`
Спасибо
Ответы
Ответ 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>");