2010-12-02 53 views
1

いくつかのクラスメートと私は、ワードラップを使用して文字列のArrayListを出力する必要があるJavaの宿題に取り組んでいます。 。私たちはこれを広く研究し、これを行うためのJava APIベースの方法を見つけることはできません。ワードラップを持つPrintWriterに文字列のArrayListを印刷する

私は宿題に関する質問をするのが一般的に間違っていることは知っていますが、これを行うための最良の方法の推奨事項を探しているだけです。これは宿題の大部分ではなく、わずかな出力要件です。

理想的には、すでに整形済みなので、ArrayListのtoStringをワードラップすることができます。

+0

ArrayList内の文字列の構成についてもう少し詳しく説明できますか?同様に、彼らは個々の言葉ですか? – seekerOfKnowledge

+0

私たちが書いているクラスは、テキストファイル内のキーワードの出現を分析することです。 ArrayList自体にはIntegerのコレクションが保持されており、それぞれが単語の出現位置になります。私はそれがちょうどtoStringされ、Stringとして扱われると思う。 ArrayListでtoStringを呼び出すと、適切に表示されます。単語の折り返しがないだけです。 – wjl

+0

ArrayListがIntegersを保持している場合、toStringを呼び出すと整数値がテキストとして書式設定され、表示されます。確かにそれはあなたが望むものではありません。対応する位置に実際の言葉を表示したくないのですか? –

答えて

2

これは私のための最初のものです。私が割り当てたプロジェクトの1つについて、私の学生の1人が質問を投稿したのは初めてです。それがフレーズされた方法、アルゴリズムを探していたこと、皆さんが共有してきた答えは私にとってはうまくいっています。しかし、これは物事を複雑にしようとする典型的なケースです。言及されていない仕様の一部は、80文字の制限が厳しい制限ではないということでした。私は、出力ファイルの各行は約80文字でなければならないと言いました。 80歳を少し越えることはOKだった。ソリューションの私のバージョンでは、私はちょうど実行カウントを持って、行末を追加するためにカウントのモジュラスを行いました。私は出力ファイルが正しく見えるまでモジュラスの値を変えました。これは、実際には短い数値を持つ行になりました。そのため、数値が小さいときには別の係数を使用しました。これはプロジェクトの大きな部分ではなく、興味深いことです。

0

私たちのソリューションは、一時的な文字列を作成し、要素を1つずつ追加し、その後にコンマを付けることでした。要素を追加する前に、文字列を追加すると文字列が80文字より長くなり、それを印刷してリセットするか、単に追加するかを選択します。

これは余分な末尾のカンマで問題が残っていますが、これは何度も処理されているためうまくいきます。私はこれが本来、私の頭の中でもともともっと複雑だったので、これを避けるために探していました。

+0

私は何年も前からさまざまな環境や言語でこのようなことを実装しなければなりませんでした。しばらくすると、かなり自然になります。 :)ボーナスポイントについては、比例幅(モノスペースではない)のフォントでこれをどうやって行うのか考えてみてください。 –

0

他のライターとオーバーライドメソッドpublic void write(String str, int off, int len) throws IOExceptionをラップする独自のWrapTextWriterを作成することをお勧めします。ここではループで実行し、ラッピングのロジックを実行する必要があります。

このロジックは、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)"のような関数をその中に書くだけで簡単に関数を書くことができます。私はあなたの問題を解決するには良い方法だと思います。 :)

関連する問題