我需要在 Java 中操作大字符串(再次删除和添加已删除的字符,移动字符),但仍想记住原始位置偏移量。例如,“计算机”一词从原始文本中的偏移量 133 开始,然后移动到位置 244,我仍然想要它最初位于位置 133 的信息。最丑陋(和资源匮乏)的解决方案是为每个字符它的原始位置加上它的位置变化。肯定有更好的解决方案,但也有更复杂的解决方案。有没有什么好的文本处理库可以解决我的问题?我不想重新发明轮子。
问候, 凯
我需要在 Java 中操作大字符串(再次删除和添加已删除的字符,移动字符),但仍想记住原始位置偏移量。例如,“计算机”一词从原始文本中的偏移量 133 开始,然后移动到位置 244,我仍然想要它最初位于位置 133 的信息。最丑陋(和资源匮乏)的解决方案是为每个字符它的原始位置加上它的位置变化。肯定有更好的解决方案,但也有更复杂的解决方案。有没有什么好的文本处理库可以解决我的问题?我不想重新发明轮子。
问候, 凯
这些字符串有多大?鉴于当今可用的内存量,蛮力可能是要走的路。
您谈论移动单词,但存储字符位置。为什么不存储单词位置以及每个单词实例的历史记录。请注意,您可以很聪明并利用享元模式来保存这些对象的多个实例,直到您需要为止。即您的“字符串”对象包含一个“计算机”单词对象,但记录该单词出现在位置 133、245、667 等处(加上您需要时的历史记录)
您所指的问题正式称为“字符串到字符串校正问题”,与Delta Encoding和Levenshtein Distance相关。 这是计算距离的代码(在Java中)。所有差异代码都在那里,您只需添加跟踪步骤的代码,以便您可以反转它们或跟踪它们。注意:“移动”一个单词或字符将是同时出现的同一单词的删除/插入对。
这应该适用于字符、单词和子字符串移动。
在强调效率之前,先做一个信封计算。当您对此感到满意并拥有代码时,您可以使用分析器/秒表进行仔细检查。
Swing 文本形式的现成解决方案。它应该可以在 Swing 上下文之外使用,尽管 IIRC 它试图在 EDT 上触发异常(以典型的 Swing 线程敌对方式)——可能想要检查一下。即使在插入和删除之后,有些Position
对象也会跟踪 a 内的字符位置。Document
如果不出意外,它将显示如何完成。据推测,Apache Harmony 实现附带了适合大多数普通人的许可证。