如何在一定长度后拆分字符串?但它应该在单词完成后分开

How to split a string after a certain length? But it should be divided after word completion

我想把一个字符串分成一定长度后的字符串列表。示例我想在第 50 个字符之后分割一个字符串,但是如果第 50 个字符的单词没有完成,它应该在单词完成后分割

List<String> remarksList = new ArrayList<>();
String remarks = "I want to split in to multiple strings after every" +
        " 50 charcters but if there any word not completed it should" +
        " be divded after word completion";
int length = remarks.length();
for (int i = 0; i < length; i += NoaConstant.ARRIVAL_FREE_TEXT_LENGTH) {
    remarksList.add(remarks.substring(i,
            Math.min(length, i + NoaConstant.ARRIVAL_FREE_TEXT_LENGTH)));
}

这是一种简单的方法。它假定 space 分隔单词。它的工作原理如下:

  • 找到第一个 space 从所需字符串长度开始的索引。
  • 如果 return 值为 -1(未找到 space),使用字符串长度。
  • 获取从 0 到该索引的子字符串。
  • 如果那是字符串的结尾,则中断。
  • else 用字符串的剩余部分替换起始文本,跳过刚刚找到的 space.
String remarks = "I want to split in to multiple strings after every 50 charcters but if there any word not completed it should be divded after word completion";

int length = 50;
List<String> remarksList = new ArrayList<>();
for(;;) {
       int end = remarks.indexOf(" ", length);
       end = end >= 0 ? end : remarks.length();
       String substr = remarks.substring(0,end);
       remarksList.add(substr);
       if (end >= remarks.length()) {
           break;
       }
       remarks = remarks.substring(end+1);
}

remarksList.forEach(System.out::println);

版画

I want to split in to multiple strings after every
50 charcters but if there any word not completed it
should be divded after word completion

您可以将此字符串拆分为一个单词数组,然后遍历此数组并使用 StringBuilder 将单词追加到一定长度的行中。或者,对于每个单词,您可以检查该单词的至少一半是否适合一行,如果不适合,则开始新的一行。您的代码可能如下所示:

String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, " +
        "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
        "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " +
        "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in " +
        "reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla " +
        "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in " +
        "culpa qui officia deserunt mollit anim id est laborum.";

int length = 55;
StringBuilder builder = new StringBuilder();

ArrayList<String> lines = new ArrayList<>();
Arrays.stream(text.split("\s+")).forEach(w -> {
    if (builder.length() + w.length() / 2 > length) {
        lines.add(builder.toString().trim());
        builder.delete(0, builder.length());
    }
    builder.append(w).append(" ");
});
lines.add(builder.toString().trim());

// output line by line
lines.forEach(System.out::println);

输出:

Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.