我和一些同学正在为Java进行家庭作业分配,该作业要求我们使用Word Wrap将字符串的数组列表打印给Printwriter,因此没有输出都通过80个字符。我们已经广泛地搜索了这一点,找不到任何基于Java API的方法来做到这一点。

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

理想情况下,我希望能够wordwrap arraylist的tostring,因为它的格式已经很好。

有帮助吗?

解决方案

好吧,这对我来说是第一个,这是我的一个学生第一次发布有关我分配的项目之一的问题。他正在寻找一种算法的方式,而您分享的答案对我来说很好。但是,这是试图使事情变得过于复杂的典型情况。未提及的规格的一部分是80个字符的限制不是硬限制。我说输出文件的每一行必须长约80个字符。可以超过80多一点。在我的解决方案版本中,我只是进行了运行计数,并进行了计数的模量来添加线路结束。我改变了模量的值,直到输出文件看起来正确。这导致线条的数字确实很短,因此当数字很小时我使用了不同的模量。这不是该项目的重要组成部分,有趣的是,这引起了很多关注。

其他提示

我们的解决方案是创建一个临时的字符串,然后一一添加元素,然后是逗号。在添加元素之前,请检查是否添加它会使字符串超过80个字符,然后选择是否要打印并重置或只是附加。

这仍然存在额外尾声的问题,但是要处理的次数很多,我们会没事的。我一直希望避免这种情况,因为它最初比实际上更复杂。

我认为,更好的解决方案是创建自己的包装纸,以包装任何其他作家并覆盖方法 public void write(String str, int off, int len) throws IOException. 。在这里,它应该循环运行并执行包装逻辑。

这种逻辑不像 str.substring(80). 。如果您要处理真实的文本并希望正确包装它(即不要剪裁单词,不要将昏迷或点移到下一行等),则必须实现一些逻辑。它可能不是太复杂,但可能取决于语言。例如,在英语中,在法语中,单词和结肠之间没有空间,它们在它们之间放置空间。

因此,我进行了5秒的谷歌搜索,并找到了以下内容 讨论 那可以帮助您。

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)“,里面有那个算法。我认为,解决您的问题的好方法。:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top