gpt4 book ai didi

java - 在 Java 或 Scala 中分解长行文本

转载 作者:行者123 更新时间:2023-12-02 06:30:28 25 4
gpt4 key购买 nike

我有一个String longLineOfWords ,我想分成几行( List<String> severalShortLinesOfWords 或类似的)。

一行是否太长,是否应该被分解,由以下函数确定:

private def isLineTooLong(line: String): Boolean = {
val bufferedImage = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB)
val graphics = bufferedImage.getGraphics

val metrics = graphics.getFontMetrics(font)

metrics.stringWidth(line) > imgWidth
}

这对我来说是困难的编程。有人可以帮助我吗?

最佳答案

isLineTooLong 方法的实现不会影响您解决此问题的方式。

您需要做的是:

  1. 将这行内容拆分为单词。
  2. 创建一个空列表。
  3. 以空字符串s开头
  4. 反复向 s 添加单词,直到它变得太长或单词用完
  5. 回溯一个单词 - 使用添加单词之前的上一行,并将其添加到结果列表中。将您未使用的单词推回到单词集合中!
  6. 从第 3 步开始重复此过程,直到没有更多单词为止
  7. 非常重要:在屏幕上显示结果列表,以检查其看起来是否大致正确。

这称为自动换行。事实上,您要做的就是对文本进行自动换行,以便以默认字体显示(注意:这可能不是固定宽度字体,因此如果在终端中以固定宽度字体打印出来,您会得到结果可能比您预期的更加锯齿)。

要在 Scala 中实现上述算法,您可以使用递归、迭代或递归方案(例如折叠和展开)。使用您喜欢的任何一个。您还可以使用递归或迭代在 Java 中实现它。

顺便说一句,您可以通过执行我所说的“手动部分评估”并减小图像大小来提高 isLineTooLong 的效率,如下所示:

private val isLineTooLong: String => Boolean = {
val bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB)
val graphics = bufferedImage.getGraphics

val metrics = graphics.getFontMetrics(font)

(line: String) => metrics.stringWidth(line) > imgWidth
}

此优化的唯一缺点是 BufferedImage 及其内部引用的关联对象不会被垃圾回收,直到 isLineTooLong 本身被垃圾回收(这可能永远不会) ,取决于您放置它的位置)。

关于java - 在 Java 或 Scala 中分解长行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20107835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com