2010-12-02 28 views
1

一些同学和我正在为Java做家庭作业,这要求我们使用换行将字符串的ArrayList打印到PrintWriter,以便输出不会传递80个字符。我们已经广泛地使用Google,并且找不到任何基于Java API的方式来执行此操作。用字换行打印字符串的ArrayList到PrintWriter

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

理想情况下,我想能够打包ArrayList的toString,因为它已经很好地格式化了。

+0

你能否提供一些关于ArrayList中字符串组成的细节?像,他们是个人的话吗? – seekerOfKnowledge 2010-12-02 06:29:49

+0

我们正在编写的类正在分析文本文件中关键字的出现次数。 ArrayList本身持有Integer的集合,每个集合都是这个词出现的位置。我认为它可以被串起来并作为一个字符串处理。在ArrayList上调用toString会正确显示它,而不是在换行。 – wjl 2010-12-02 06:31:20

回答

2

嗯,这对我来说是第一次,这是我的学生第一次发布了关于我分配给他们的一个项目的问题。这句话的方式,他正在寻找一种算法,你们都分享的答案对我来说很好。但是,这是一个试图让事情变得复杂的典型例子。规范中没有提到的一部分是80个字符的限制并不是硬性限制。我说输出文件的每一行必须大约80个字符长。稍微超过80就可以了。在我的解决方案版本中,我只有一个运行计数,并为计数添加了行结束的模数。我改变了模数的值,直到输出文件看起来正确。这导致小数行非常短,因此当数字很小时我使用了不同的模数。这不是该项目的重要组成部分,有趣的是这引起了很多关注。

0

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

这仍然有额外的尾随逗号的问题,但这已经处理了很多次,我们会没事的。我期待避免这种情况,因为它本来比我的头脑更复杂。

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)”。我认为,这是解决您的问题的好方法。 :)