Разделить строку на строку [], чтобы каждый элемент содержал до 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));

Если вы имеете в виду что-то еще, просто прокомментируйте! Может быть, вам нужно добавить больше шаблонов в вашей строке есть вкладки, новая строка и другие специальные символы.

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