2011-08-10 7 views
0

特定の段落がインデントされている(段落の各行がインデントされている)ようにテキストをファイルに保存したいとします。私はBufferedWriterまたはScannerなどを使用しています。文字を数えることなく、これをどうやってやるの?ファイルにインデントされたテキストを書き込む

+1

あなたはどのクラスを使用していますか?なぜあなたは文字を数える必要がありますか?すでに試したことがありますか?もしそうなら、私たちはあなたのコードを見ることができますか? – Jeffrey

+0

私はBufferedWriterを使用していますが、私は何でもありません。私は、使用する適切なクラスを見つけることができなかったので、何の試みもしていません。私は文字を数える必要はないと思うが、それは実行可能なハックである。ソクラテスありがとう。 –

+0

指定された段落のインデントを決定するアルゴリズムが必要です。あなたはそれを持っていますか? –

答えて

2

すべての改行を見つけ、各改行の後に適切な数のスペースを挿入する必要があります。

だから、コードは常に各文字を見る必要があり、場合によってはどこでどのくらいインデントするかを見つけるためにテキストを解析する必要があります。

構文解析と書式設定を処理するjava.io.Writerを実装できます。最も効率的な方法は、charバッファを直接操作することですが、新しいStringを作成してString関数を使用するよりもはるかに複雑です。

ファイル全体のインデントが同じ場合は、単純なString.replaceAll()を実行し、改行を改行とそれに続くスペースの数で置き換えることができます。動的インデントが必要な場合は、インデントレベルの変更箇所を解析(検索)し、改行やインデントレベルが変更された場合はそれぞれの文字をチェックし、今購入すると複雑になってしまう...

0

ここに解決策があります。この方法では、はすべての改行をインデントに置き換えます。レベルをインデントするには、indent()コールが必要です。インデントを解除するには、unindent()メソッドを呼び出します。

public class IndentPrintWriter extends java.io.PrintWriter 
{ 
    private boolean newLine; 
    private String singleIndent = " "; 
    private String currentIndent = ""; 

    public IndentPrintWriter(Writer pOut, String indent) 
    { 
    super(pOut); 
    this.singleIndent = indent; 
    } 

    public void indent() 
    { 
    currentIndent += singleIndent; 
    } 

    public void unindent() 
    { 
    if (currentIndent.isEmpty()) return; 
    currentIndent = currentIndent.substring(0, currentIndent.length() - singleIndent.length()); 
    } 

    @Override 
    public void print(String pString) 
    { 
    // indent when printing at the start of a new line 
    if (newLine) 
    { 
     super.print(currentIndent); 
     newLine = false; 
    } 

    // strip the last new line symbol (if there is one) 
    boolean endsWithNewLine = pString.endsWith("\n"); 
    if (endsWithNewLine) pString = pString.substring(0, pString.length() - 1); 

    // print the text (add indent after new-lines) 
    pString = pString.replaceAll("\n", "\n" + currentIndent); 
    super.print(pString); 

    // finally add the stripped new-line symbol. 
    if (endsWithNewLine) println(); 
    } 

    @Override 
    public void println() 
    { 
    super.println(); 
    newLine = true; 
    } 
}