Разделить строку на строку [], чтобы каждый элемент содержал до 100 символов и заканчивался пробелом
Как мне это сделать? Я пытался что-то вроде этого, но я, кажется, не могу получить дальше.
public void speak(String text)
{
String[] textArray = text.split(" ");
System.out.println(text);
StringBuilder builder = new StringBuilder();
int index = 0;
while(builder.length() < 99)
{
builder.append(textArray[index] + " ");
index++;
}
System.out.println(builder.toString());
}
РЕДАКТИРОВАТЬ: Мне нужно, чтобы каждая строка была отдельной строкой длиной всего 100 символов. Так что мне понадобится каждая строка в массиве или арралисте, например.
4 ответа
ArrayList<String> lines = new ArrayList<>();
int index = 0;
while(index < textArray.length()) {
StringBuilder builder = new StringBuilder();
if(textArray[index].length() >= 99) {
build.append(textArray[index]);
index++;
} else {
while(builder.length() < 99 - (textArray[index].length())) {
builder.append(textArray[index] + " ");
index++;
if(!(index < textArray.length()) {
break;
}
}
lines.add(builder.toString());
}
Внутренний while
Цикл будет делать то, что он уже делает в вашем коде, построить одну строку длиной менее 100 символов, добавив пробел после каждого слова.
Затем, когда у нас будет более 100 символов, добавьте символ новой строки в строку и продолжайте.
Как примечание, этот бит кода:
if(textArray[index].length() >= 99) {
build.append(textArray[index]);
index++;
}
будет обрабатывать (должен быть редкий) регистр слова длиной более 99 символов (без пробелов). Как написано, это будет держать это слово полностью вместе в строке, и может привести к строке длиной более 100 символов. Если вам нужно другое поведение, посмотрите на этот кусочек кода.
Но слова с более чем 99 символами, вероятно, должны быть довольно редкими, и это может быть полной проблемой.
Для переноса текста вместо того, чтобы фокусироваться на пробелах, сосредоточьтесь на пределе в 100 символов. Для большей части текста пробелы встречаются гораздо чаще, чем один раз на 100 символов.
public void speak(String text) {
while(text.length() > 100) {
int nextSpace = text.lastIndexOf(" ", 99);
if (nextSpace == -1) { //no spaces for 100 characters
System.out.println(text.substring(0, 100));//give as many characters as possible, then split anyway
text = text.substring(100);
continue;
}
System.out.println(text.substring(0, nextSpace));
text = text.substring(nextSpace + 1);
}
System.out.println(text);
}
Я знаю, что этот ответ запоздал и немного неэффективен, но я думаю, что он хорошо справляется со своей задачей.
public class StringSplitter
{
private int maxCharactersPerLine = 100;
public List<string> GetTextLines(string text)
{
var result = new List<string>();
if(text.Length <= this.maxCharactersPerLine)
{
result.Add(text);
return result;
}
string words[] = text.Split(new[]{' '}, StringSplittingOptions.RemoveEmptyEntries);
//accumolator, describes a line of text up to maximum character length.
string temp = string.Empty;
//this is so that we don't append an empty space on each new line.
bool isBeginingWord = true;
foreach(var word in words)
{
//there is a possibility that a text line has more than maximum
//consecutive characters without having a space. This is edge case.
if(temp.Length > this.maxCharactersPerLine)
{
result.Add(temp);
continue;
}
//if adding the next word in the list will exceed the
//maximum characters per line of text
if((temp + " " + word).Length > this.maxCharactersPerLine)
{
result.Add(temp); //add the accumolator to the list.
temp = ""; //reset the accumolator
isBeginingWord= true; //reset beginning of word flag.
continue;
}
//adding the next word from the list results in accumolator still
//still shorter than the maximum characters per line of text.
if(isBeginingWord)
{
temp = word;
isBeginingWord = false;
continue;
}
temp = temp + " " + word;
}
return result;
}
}
Это возможно с регулярным выражением, ему нужно меньше кода:
Pattern p=Pattern.compile("[\\s\\S]{99}");
Matcher matcher = p.matcher(s);
ArrayList<String> list= new ArrayList<>();
int lastFound=0;
while (matcher.find()){
list.add(matcher.group()+" ");
lastFound = matcher.end();
}
list.add(s.substring(lastFound));
Если вы имеете в виду что-то еще, просто прокомментируйте! Может быть, вам нужно добавить больше шаблонов в вашей строке есть вкладки, новая строка и другие специальные символы.