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; 
    } 
}