段落全体を含む別のファイルから入力を読み取っています。段落内の単語をリストに保存しています。私の目標は、各行が文字数制限を超えないように、別のファイルから段落全体を印刷することです。以下を使用してリストを反復処理しています。
for (String word: words)
文字数制限のコードの書き方がわかりません。メソッドを使用することを考えStringBuffer
ていましたが、よくわかりません。何か案は?
段落全体を含む別のファイルから入力を読み取っています。段落内の単語をリストに保存しています。私の目標は、各行が文字数制限を超えないように、別のファイルから段落全体を印刷することです。以下を使用してリストを反復処理しています。
for (String word: words)
文字数制限のコードの書き方がわかりません。メソッドを使用することを考えStringBuffer
ていましたが、よくわかりません。何か案は?
これはあなたが望むもののようです:JavaのBreakIterator
私の個人的な実装。私のカウボーイ時代のコードは古いですが、動作します。必要に応じて微調整してください。
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();
}
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());
}
実際、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.
これは、事前構成された制限よりも長い「単語」トークンを考慮していないことに注意してください。