【问题标题】:Printing an ArrayList of Strings to a PrintWriter with word wrap使用自动换行将字符串的 ArrayList 打印到 PrintWriter
【发布时间】:2010-12-02 06:24:48
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否提供更多关于 ArrayList 中字符串的构成的详细信息?比如,它们是单独的词吗?
  • 我们正在编写的类是分析文本文件中关键字的出现。 ArrayList 本身包含一个整数的集合,每个都是单词出现的位置。我认为它可以只是 toString'd 并作为字符串处理。在 ArrayList 上调用 toString 可以正确显示它,只是没有自动换行。
  • 如果 ArrayList 包含整数,则在其上调用 toString 会将整数值格式化为文本并显示这些值。当然这不是你想要的;你不想在相应的位置显示实际的单词吗?
  • 该项目的规范是显示关键字,后跟数字列表,指示它们在文件中的位置。我不确定这会有什么用,但这是必需的。

标签: java arraylist word-wrap printwriter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这仍然存在额外尾随逗号的问题,但已经处理了很多次,我们会没事的。我希望避免这种情况,因为它最初在我的脑海中比实际情况更复杂。

    【讨论】:

    • 多年来,我不得不在各种环境和语言中实现这类事情——包括通过在适当的屏幕位置为字母绘制图像来手动渲染文本。一段时间后,它变得很自然。 :) 对于奖励积分,请考虑如何使用比例宽度(不是等宽)字体来做到这一点。
    【解决方案3】:

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

    这个逻辑不像str.substring(80)那么简单。如果您正在处理真实文本并希望正确包装它(即不要剪切单词,不要将逗号或点移动到下一行等),您必须实现一些逻辑。它可能不太复杂,但可能取决于语言。例如,在英语中,单词和冒号之间没有空格,而在法语中,它们之间有空格。

    所以,我进行了 5 秒的谷歌搜索,发现以下 discussion 可以帮助您。

    【讨论】:

      【解决方案4】:
      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&lt;String&gt; strings)”,其中包含该算法。我认为,这是解决您的问题的好方法。 :)

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多