java中限制一行String的字符数

问题描述

我希望我的一行最多包含 69 个字符而不会断词。

假设我的字符串如下

\n
TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXTEXTRA\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT

我的输出应该是

\n
TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n 
TEXTEXTRA\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT

我不想在计算字符时计算 \n,也不想在两者之间断词。

第 69 个字符之后或第 69 个字符处的任何单词都应放在下一行。

有时 \n 可能不会出现在字符串中,但我想在第 69 个字符处拆分字符串。

我的代码如下

public static char[] createLineofMaximumNumberOfChars(char[] textArray) {
        int count = 1;
        int j = 0;
        for (int i = 0; i < textArray.length; i++) {

            if (textArray[i] == '\n' && count != maxNoOfCharPerRow) {
                count = 1;
                j = i;
            } else if (textArray[i] != '\n') {
                count++;
            }

            if (count == maxNoOfCharPerRow) {
                j = j + count;
                if (i == textArray.length - 2)
                    continue;
                if (j < textArray.length - 1) {
                    if (textArray[j] == '\n' || textArray[j + 1] == '\n') {
                        count = 1;
                        continue;
                    }

                }
                while (j >= 0 && !Character.isWhitespace(textArray[j])) {
                    j--;
                }
                if (j >= 0) {
                    textArray[j] = '\n';
                    count = 1;
                }
            }

        }

        return textArray;
    }

解决方法

您可以在一个 for 循环中的 "\n" 和内部 for 循环中的空白处再次使用 String#split() 方法来执行此操作,例如:

String txt = "\n"
           + "TEXT\n"
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXTEXTRA\n"
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n"
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT\n"
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT";
    
boolean hasNewLine = txt.contains("\n");
String[] textParts = (hasNewLine ? txt.split("\n") : new String[] {txt});
StringBuilder finalString = new StringBuilder("");
for (int i = 0; i < textParts.length; i++) {
    if (textParts[i].length() > 69) {
        StringBuilder sb = new StringBuilder("");
        String[] words = textParts[i].split("\\s+");
        for (int j = 0; j < words.length; j++) {
            if ((sb.toString().length() + words[j].length()) > 69) {
                // Line must be filled since current word won't fit....
                sb.append(System.lineSeparator()); 
                if (hasNewLine) {
                    // Specific format required...
                    finalString.append(sb.toString()).append(words[j]).append(System.lineSeparator());
                }
                else {
                    finalString.append(sb.toString());  // place completed line into finalString
                    sb.delete(0,sb.capacity());        // empty the StringBuilder object so to start new line
                    sb.append(words[j]);                // set in the current word that didn't fit previous line.
                }
            }
            else {
                if (!sb.toString().isEmpty()) {
                    sb.append(" ");
                }
                sb.append(words[j]);
            }
        }
        // if sb contains words when loop finishes then append them to finalString.
        if (!hasNewLine && !sb.toString().isEmpty()) {
            finalString.append(sb.toString());
        }
    }
    else {
        // If the supplied String doesn't contain more than 69 characters
        // then append it to finalString.
        finalString.append(textParts[i])
                .append((i < (textParts.length - 1) ? System.lineSeparator() : ""));
    }
}

// Print the result to console.
System.out.println(finalString.toString());

控制台窗口将生成的字符串显示为:

TEXT
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXTEXTRA
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT

编辑:根据评论:↓↓↓

如果字符串中不存在 \n 并且我仍然想修剪怎么办 第 69 个字符的行 – Pawan Patil

如果换行符 (\n) 不包含在字符串中,那么我们必须假设所提供的字符串只不过是一个以空格分隔的字符串,代码将通过内循环对其进行相应处理。然而,需要进行一些小的更改以适应这种特殊情况,以便整个代码可以处理或处理。

布尔标志 (hasNewLine) 用于指示字符串中是否包含换行符 (\n)。如果 true 则根据换行符拆分字符串,并使用内部 for 循环相应地处理此拆分中的每个元素(如前)。

但是,如果提供的字符串中没有换行符,则布尔标志 hasNewLine 将包含 false textParts 字符串数组将只包含一个元素,即整个提供的字符串。 Ternary Operator 用于确定此数组要保存的内容,例如:

String[] textParts = (hasNewLine ? txt.split("\n") : new String[] {txt});

正如您现在所看到的,在内部 for 循环中也使用了 hasNewLine 布尔标志,因为最初需要并且仍然需要特定的输出结果格式。这个内循环需要适应不同的情况。

更新的代码已在上面应用,以适应您的评论。现在,如果按照您的帖子中的指示提供了一个字符串,您将在控制台窗口中显示您想要的发布结果。另一方面,如果提供了一个空格分隔的字符串,如下所示,没有换行符:

String txt = "TEXT "
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXTEXTRA "
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT "
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT "
           + "TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT";

然后在处理后将在控制台窗口中显示以下内容:

TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXTEXTRA TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT
TEXT TEXT
,

更新了 devilshnd's 答案,因此即使没有“\n”也能正常工作

 public static char[] answer(char[] textArray){
    String s = new String(textArray);
    boolean isNewLinePresent  = s.contains("\n");
    int count = 1;
    int maxNoOfCharPerRow = 69;
   if(isNewLinePresent) {
       int j = 0;
       for (int i = 0; i < textArray.length; i++) {

           if (textArray[i] == '\n' && count != maxNoOfCharPerRow) {
               count = 1;
               j = i;
           } else if (textArray[i] != '\n') {
               count++;
           }

           if (count == maxNoOfCharPerRow) {
               j = j + count;
               if (i == textArray.length - 2)
                   continue;
               if (j < textArray.length - 1) {
                   if (textArray[j] == '\n' || textArray[j + 1] == '\n') {
                       count = 1;
                       continue;
                   }

               }
               while (j >= 0 && !Character.isWhitespace(textArray[j])) {
                   j--;
               }
               if (j >= 0) {
                   textArray[j] = '\n';
                   count = 1;
               }
           }

       }
   }

   else {
       count = maxNoOfCharPerRow;
       while (count<=s.length() && textArray.length>maxNoOfCharPerRow && !(s.charAt(s.length()-1)=='\n')){
           System.out.println(count);
           s = s.substring(0,count) + "\n" + s.substring(count);
           count = count + maxNoOfCharPerRow + 1;
       }
       textArray = s.toCharArray();
   }
    return textArray;


}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...