2010-12-02 2 views
1

일부 클래스 메이트와 저는 랩을 사용하여 PrintWriter에 문자열의 ArrayList를 인쇄해야하므로 출력물이 80 문자를 넘어 가지 않도록 Java의 숙제를 진행하고 있습니다. . 우리는 광범위하게이를 봤으며이를 수행하는 Java API 기반 방법을 찾을 수 없습니다.워드 랩으로 PrintWriter에 문자열의 ArrayList를 인쇄하십시오.

저는 숙제 문제를 물어 보는 것이 일반적으로 "잘못되었습니다"라고 알고 있지만,이를 위해 최선의 방법을 찾거나 API에서 뭔가를 놓친 경우에만 찾고 있습니다. 이는 숙제의 주요 부분이 아니며 소량의 출력 요구 사항입니다.

이상적으로, 나는 이미 멋지게 형식화되어 있으므로 ArrayList의 toString을 워드 랩 할 수 있어야합니다.

+0

ArrayList의 문자열 구성에 대해 좀 더 자세히 설명해 주시겠습니까? 마찬가지로, 그들은 개별 단어입니까? – seekerOfKnowledge

+0

우리가 쓰고있는 클래스는 텍스트 파일에서 키워드의 발생을 분석하는 것입니다. ArrayList 자체는 Integer 컬렉션을 보유하고 있으며, 각각의 컬렉션은 단어 발생 위치입니다. 나는 그것이 toString과 String으로 처리 될 수 있다고 생각한다. ArrayList에 toString을 호출하면 올바르게 표시되고 단어 줄 바꿈만으로는 표시되지 않습니다. – wjl

+0

ArrayList에 Integer가있는 경우, toString를 호출하면 정수 값이 텍스트 형식으로 표시됩니다.확실히 그것은 당신이 원하는 것이 아닙니다. 해당 위치에 실제 단어를 표시하고 싶지 않으십니까? –

답변

2

글쎄, 내게 처음이다. 내 학생들 중 한 명이 내가 배정한 프로젝트 중 하나에 대해 질문을 올린 것은 이번이 처음이다. 말하자면, 그는 알고리즘을 찾고 있었고, 당신이 공유 한 답은 저와 잘 어울립니다. 그러나 이것은 일을 복잡하게 만드는 전형적인 경우입니다. 언급되지 않은 사양의 일부는 80 자 제한이 엄격한 제한이 아니 었습니다. 각 출력 파일의 줄은 대략 80 자 여야한다고했습니다. 80 조금 넘는 것은 괜찮 았습니다. 솔루션의 제 버전에서는 방금 실행 횟수가 있었고 행 수를 추가하기 위해 계수의 계수를 계산했습니다. 출력 파일이 제대로 보일 때까지 모듈러스의 값을 변경했습니다. 그 결과 작은 수의 줄이 실제로 짧아 져서 숫자가 작을 때 다른 수법을 사용했습니다. 이것은 프로젝트의 큰 부분이 아니었고 흥미로운 점이 많습니다.

0

우리의 해결책은 임시 문자열을 만들고 요소를 하나씩 추가 한 다음 쉼표를 추가하는 것이 었습니다. 요소를 추가하기 전에 문자열을 추가하면 80자를 초과하는지 확인하고 인쇄 할 것인지 재설정할지 또는 그냥 추가할지 여부를 선택하십시오.

이것은 여전히 ​​여분의 후행 쉼표로 인해 문제가 있지만, 여러 번 처리되었으므로 괜찮을 것입니다. 원래 머리보다 복잡하기 때문에 나는 이것을 피하려고했습니다.

+0

필자는 적절한 화면 위치에서 글자의 이미지를 그리는 방법으로 텍스트를 수동으로 렌더링하는 것을 포함하여 수년 동안 다양한 환경과 언어에서 이러한 종류의 작업을 구현해야했습니다. 잠시 후에 그것은 자연스럽게됩니다. :) 보너스 포인트의 경우, 비례 폭 (고정 폭 글꼴이 아닌) 글꼴로이 작업을 수행하는 방법에 대해 생각해보십시오. –

0

더 나은 솔루션은 다른 작성자를 감싸는 고유 한 WrapTextWriter를 만들고 public void write(String str, int off, int len) throws IOException 메서드를 재정의하는 것입니다. 여기서는 루프에서 실행되고 줄 바꿈 논리를 수행해야합니다.

이 논리는 str.substring(80)만큼 간단하지 않습니다. 실제 텍스트를 처리하고 올바르게 감싸는 경우 (예 : 단어를 자르지 말고, 줄무늬 나 점을 다음 줄로 이동하지 마십시오) 일부 논리를 구현해야합니다. 그것은 아마도 너무 복잡하지는 않지만 아마도 언어 의존적 일 것입니다. 예를 들어 영어에서는 단어와 콜론 사이에 공백이 없지만 프랑스어에서는 공백을 넣습니다.

그래서 저는 5 초 인터넷 검색을 수행하여 다음을 발견했습니다 : discussion 당신을 도울 수 있습니다.

0
private static final int MAX_CHARACTERS = 80; 

public static void main(String[] args) 
    throws FileNotFoundException 
{ 
    List<String> strings = new ArrayList<String>(); 

    int size = 0; 

    PrintWriter writer = new PrintWriter(System.out, true); // Just as example 

    for (String str : strings) 
    { 
     size += str.length(); 

     if (size > MAX_CHARACTERS) 
     { 
      writer.print(System.getProperty("line.separator") + str); 
      size = 0; 
     } 
     else 
      writer.print(str); 
    } 

} 

"void printWordWrap(List<String> strings)"과 같은 알고리즘을 내부에 쓰면됩니다. 제 생각에는, 당신의 문제를 해결하는 좋은 방법입니다. :)