打印每行具有字符限制的行

时间:2013-10-07 20:57:59

标签: java

我正在从包含整个段落的单独文件中读取输入。我将段落中的单词存储在列表中。我的目标是从单独的文件中打印出整个段落,每行不超过字符的字符限制。我正在使用:

遍历列表
for (String word: words)

我不确定如何编写字符限制的代码。我在考虑使用StringBuffer方法,但我不确定。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

这似乎是你想要的:Java's BreakIterator

答案 1 :(得分:0)

你确实可以使用StringBuffer(或StringBuilder,如果你不关心线程安全),在你遇到它们时暂时保存它们。要强制执行字符限制,您可以计算添加单词之前添加到缓冲区中的字符数。一旦达到限制,刷新缓冲区(进入输出缓冲区/文件)并重新开始。

我刚刚做了一些快速而又脏的东西:

import java.util.Scanner;

public class CharLimit {

    static int LIMIT = 79;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder buffer = new StringBuilder(LIMIT);

        while (sc.hasNextLine()) {
            Scanner sc2 = new Scanner(sc.nextLine());
            while (sc2.hasNext()) {
                String nextWord = sc2.next();
                if ((buffer.length() + nextWord.length() + 1) > LIMIT) {
                    // we would have exceeded the line limit; flush
                    buffer.append('\n');
                    System.out.print(buffer.toString());

                    buffer = new StringBuilder(nextWord);
                }
                else {
                    buffer.append((buffer.length() == 0 ? "" : " ") + nextWord);
                }
            }
        }

        if (buffer.length() > 0) {
            System.out.print(buffer.toString() + "\n");
        }

        System.exit(0);
    }

}

示例:

???:/tmp$ cat input

Lorem ipsum dolor sit amet, consectetur adipisicing 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.

???:/tmp$ java CharLimit < input 
Lorem ipsum dolor sit amet, consectetur adipisicing 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.

请注意,这不会考虑比预先配置的限制更长的“word”令牌。

答案 2 :(得分:0)

我的个人实施。代码是旧的,从我的牛仔时代开始,但它确实有效。根据需要调整它。

private static final int LINE_LENGTH = 30;
private static final String SPACE = " ";
private static final String EMPTY_STRING = "";

/**
 * Formats the given input text: <br />
 * - Wraps text to lines of maximum <code>LINE_LENGTH</code> <br />
 * - Adds newline characters at each line ending <br />
 * - Returns as a string
 */
public static String getPreviewLines(final String input) 
{
    final StringTokenizer token = new StringTokenizer(input, SPACE);
    final StringBuilder output = new StringBuilder(input.length());

    int lineLen = 0;

    while (token.hasMoreTokens()) 
    {
        final String word = token.nextToken() + SPACE;

        if (lineLen + word.length() - 1 > LINE_LENGTH) 
        {
            output.append(System.lineSeparator());
            lineLen = 0;
        }

        output.append(word);

        if (word.contains(System.lineSeparator())) 
            lineLen = word.replaceAll("\\s+", EMPTY_STRING).length(); //$NON-NLS-1$
        else
            lineLen += word.length();
    }

    return output.toString();
}

答案 3 :(得分:0)

    public static String lineSeparator = System.getProperty("line.separator");
    public static int size = 10;
    /**
     * Main Method
     * @param args
     */
    public static void main(String[] args) {
    String read = "enter any text here or read it from somewhere else the idea here is to split as many words you want and print it in the format you want";        
    String[] wordArray = read.trim().split(" ");        
    printBySize(size,wordArray);

    }

    private static void printBySize(int size, String[] wordArray) {
        StringBuilder bld = new StringBuilder(size);
        for(int i=0; i<wordArray.length;i++) {

            String word = wordArray[i];

            if ((bld.length() + word.length()) >= size) {
                //if yes add a new line and create a new builder for the new line
                bld.append(lineSeparator);
                System.out.print(bld.toString());
                bld = new StringBuilder(word);
            }
            else {

                bld.append((bld.length() == 0 ? "" : " ") + word);
            }

        }
        System.out.println(bld.toString());
    }