3

我正在编写一个简单的日记控制台程序。无法真正弄清楚分解用户文本输入的最简单方法。我在一个字符串中记录了一个日记笔记,然后我希望能够将该字符串打印到控制台,但未格式化它当然只是在终端的一行中显示该字符串,这使得阅读起来非常不友好。我将如何为每个 x 个字符左右显示一个新行的字符串?我能找到的关于文本格式的所有信息都是 System.out.printf() ,但它只需要打印最少数量的字符。

4

4 回答 4

7

我建议使用一些外部库来做,比如 Apache commons:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html

并使用

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/WordUtils.html#wrap(java.lang.String , int)

static final int FIXED_WIDTH = 80;

String myLongString = "..."; // very long string
String myWrappedString = WordUtils.wrap(myLongString,FIXED_WIDTH);

这将包装你的字符串,尊重空格'',固定宽度

没有外部库

您将不得不实施它:

顺便说一句:我这里没有java的编译器来测试它,所以如果它不直接编译就不要生气。

private final static int MAX_WIDTH = 80;

public String wrap(String longString) {
    String[] splittedString = longString.split(" ");
    String resultString = "";
    String lineString = "";

    for (int i = 0; i < splittedString.length; i++) {
        if (lineString.isEmpty()) {
            lineString += splittedString[i];
        } else if (lineString.length() + splittedString[i].length() < MAX_WIDTH) {
            lineString += splittedString[i];
        } else {
            resultString += lineString + "\n";
            lineString = "";
        }
    }

    if(!lineString.isEmpty()){
            resultString += lineString + "\n";
    }

    return resultString;
}
于 2013-10-17T11:35:45.613 回答
4

如果你可以使用 apache 通用语言库,你可以使用 WordUtils 类(org.apache.commons.lang.WordUtils)。如果你前:

System.out.println("\nWrap length of 20, \\n newline, don't wrap long words:\n" + WordUtils.wrap(str2, 20, "\n", false)); [Source here][1]

如果你不能,你可以使用programmerscookbook 博客中提供的这个功能。自定义文本换行的代码

static String [] wrapText (String text, int len)
{
  // return empty array for null text
 if (text == null)
   return new String [] {};

 // return text if len is zero or less
 if (len <= 0)
   return new String [] {text};

 // return text if less than length
  if (text.length() <= len)
   return new String [] {text};

  char [] chars = text.toCharArray();
  Vector lines = new Vector();
  StringBuffer line = new StringBuffer();
  StringBuffer word = new StringBuffer();

  for (int i = 0; i < chars.length; i++) {
      word.append(chars[i]);

      if (chars[i] == ' ') {
        if ((line.length() + word.length()) > len) {
          lines.add(line.toString());
          line.delete(0, line.length());
        }

        line.append(word);
        word.delete(0, word.length());
      }
  }

 // handle any extra chars in current word
 if (word.length() > 0) {
   if ((line.length() + word.length()) > len) {
     lines.add(line.toString());
     line.delete(0, line.length());
  }
  line.append(word);
 }

// handle extra line
if (line.length() > 0) {
  lines.add(line.toString());
}

String [] ret = new String[lines.size()];
int c = 0; // counter
for (Enumeration e = lines.elements(); e.hasMoreElements(); c++) {
   ret[c] = (String) e.nextElement();
}

return ret;
}

这将返回一个字符串数组,使用 for 循环打印。

于 2013-10-17T11:38:38.440 回答
0

您可以改用以下代码。

String separator = System.getProperty("line.separator");
String str = String.format("My line contains a %s break line", NEW_LINE);
System.out.println(str)

你可以参考这个链接。 Java 多行字符串

于 2014-09-03T05:05:42.867 回答
0

您可以使用 Java java.util.StringTokenizer 按空格字符拆分单词,然后在循环中您可以在每行最喜欢的单词数之后添加一个“\n”。

这不是每个字符,但由于达到的字符数量,在任何地方拆分单词可能不太可读。

于 2013-10-17T11:41:24.380 回答