1

何人かのクラスメートと私は、Java の宿題に取り組んでいます。この宿題では、文字列の ArrayList を Word ラップを使用して PrintWriter に出力する必要があるため、出力が 80 文字を通過することはありません。これを広範囲にグーグル検索しましたが、これを行う Java API ベースの方法が見つかりません。

SO で宿題の質問をするのは一般的に「間違っている」ことはわかっていますが、これを行うための最善の方法の推奨事項、または API で何かを見逃しているかどうかを探しているだけです。これは宿題の主要な部分ではなく、ほんのわずかな出力要件です。

理想的には、既に適切にフォーマットされているため、ArrayList の toString をワードラップできるようにしたいと考えています。

4

4 に答える 4

2

これは私にとって初めてのことです。生徒の 1 人が、私が割り当てたプロジェクトの 1 つについて質問を投稿したのはこれが初めてです。彼がアルゴリズムを探していたという言い回しと、皆さんが共有した答えは、私にはまったく問題ありません。しかし、これは物事を複雑にしようとする典型的なケースです。言及されていない仕様の一部は、80 文字の制限が厳密な制限ではなかったことです。出力ファイルの各行の長さは約 80 文字である必要があると言いました。80ちょっとオーバーしてもOKでした。私のバージョンのソリューションでは、実行中のカウントがあり、カウントのモジュラスを実行して行末を追加しました。出力ファイルが適切に見えるまで、モジュラスの値を変更しました。これにより、数値が小さい行は非常に短くなるため、数値が小さい場合は別のモジュラスを使用しました。

于 2010-12-04T18:29:36.797 に答える
0

私たちの解決策は、一時的な文字列を作成し、要素を 1 つずつ追加し、その後にカンマを追加することでした。要素を追加する前に、追加すると文字列が 80 文字を超えるかどうかを確認し、それを印刷してリセットするか、単に追加するかを選択します。

これにはまだ余分な末尾のコンマの問題がありますが、これは何度も対処されているので問題ありません。もともと頭の中は実際よりも複雑だったので、これを避けようとしていました。

于 2010-12-02T06:42:14.457 に答える
0

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

このロジックは ほど単純ではありませんstr.substring(80)。実際のテキストを扱っていて、それを正しくラップしたい場合 (つまり、単語を切り取らない、コンマやドットを次の行に移動しないなど)、いくつかのロジックを実装する必要があります。おそらくそれほど複雑ではありませんが、おそらく言語に依存しています。たとえば、英語では単語とコロンの間にスペースはありませんが、フランス語では単語とコロンの間にスペースが入ります。

そのため、5 秒間のグーグル検索を行ったところ、役立つ次のディスカッションが見つかりました。

于 2010-12-02T06:55:06.470 に答える
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)そのアルゴリズムを内部に記述できます。問題を解決する良い方法だと思います。:)

于 2010-12-02T06:58:45.520 に答える