0

段落全体を含む別のファイルから入力を読み取っています。段落内の単語をリストに保存しています。私の目標は、各行が文字数制限を超えないように、別のファイルから段落全体を印刷することです。以下を使用してリストを反復処理しています。

for (String word: words)

文字数制限のコードの書き方がわかりません。メソッドを使用することを考えStringBufferていましたが、よくわかりません。何か案は?

4

4 に答える 4

2

これはあなたが望むもののようです:JavaのBreakIterator

于 2013-10-07T21:05:54.480 に答える
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();
}
于 2013-10-07T21:15:47.540 に答える
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());
    }
于 2014-03-12T21:23:37.620 に答える
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.

これは、事前構成された制限よりも長い「単語」トークンを考慮していないことに注意してください。

于 2013-10-07T21:03:06.410 に答える