1

我和一些同学正在为 Java 做一个家庭作业,要求我们使用自动换行将字符串的 ArrayList 打印到 PrintWriter,这样所有输出都不会超过 80 个字符。我们已经对此进行了广泛的 Google 搜索,但找不到任何基于 Java API 的方法来执行此操作。

我知道在 SO 上提出家庭作业问题通常是“错误的”,但我们只是在寻找最佳方法的建议,或者如果我们错过了 API 中的某些内容。这不是作业的主要部分,只是一个小的输出要求。

理想情况下,我希望能够对 ArrayList 的 toString 进行自动换行,因为它的格式已经很好了。

4

4 回答 4

2

嗯,这对我来说是第一次,这是我的一个学生第一次发布关于我分配给他们的一个项目的问题。它的措辞方式,他正在寻找一种算法,你们分享的答案对我来说很好。然而,这是一个试图让事情变得过于复杂的典型案例。规范中没有提到的部分是 80 个字符的限制不是硬限制。我说输出文件的每一行必须大约 80 个字符长。80多一点就可以了。在我的解决方案版本中,我只是有一个运行计数并做了一个计数模数来添加行尾。我改变了模数的值,直到输出文件看起来正确。这导致数字很小的行非常短,所以当数字很小时我使用了不同的模数。

于 2010-12-04T18:29:36.797 回答
0

我们的解决方案是创建一个临时字符串并一个一个地附加元素,后跟一个逗号。在添加元素之前,请检查添加它是否会使字符串长度超过 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 回答