我需要在Java中操作大字符串(删除并添加已删除的字符串) chars再次,移动chars周围),但仍然想要记住 原始位置抵消。例如。 “计算机”这个词从偏移开始 原文中的133,然后移到244位,我仍然 想要它最初在133位的信息。 最丑陋(和资源匮乏)的解决方案是存储 每个角色的原始位置加上它的位置变化。那里 肯定是更好的解决方案,但也更复杂的解决方案。 有没有好的文本操作库有解决方案 我的问题?我不想重新发明轮子。
此致 启
答案 0 :(得分:2)
这些琴弦有多大?鉴于今天可用的内存数量,蛮力可能是最佳选择。
你谈论移动单词,但存储字符位置。为什么不存储单词位置,以及每个单词实例的历史记录。请注意,您可以聪明并使用flyweight pattern来保存这些对象的多个实例,直到您需要为止。即你的'字符串'对象包含一个'计算机'单词对象,但记录该单词出现在133,245,667等位置(加上历史记录,当你需要它时)
答案 1 :(得分:1)
您所指的问题官方称为“String-to-string correction problem”,与Delta Encoding和Levenshtein Distance相关。 Here是计算距离的代码(用Java表示)。所有差异代码都存在,您只需添加跟踪步骤的代码,以便您可以反转或跟踪它们。注意:“移动”单词或字符将是同时出现的同一单词的删除/插入对。
这应该适用于字符,单词和子字符串移动。
答案 2 :(得分:0)
在强调效率之前,先做一个信封计算。当你对它有好处并且有代码时,你可以用一个分析器/秒表仔细检查。
有一个现成的解决方案,以Swing文本的形式。它应该可以在Swing上下文之外使用,虽然IIRC试图在EDT上触发异常(以典型的Swing线程 - 敌对方式) - 可能想要检查它。即使在插入和删除后,仍有Position
个对象可以跟踪Document
内的字符位置。如果没有别的,它将显示它是如何完成的。据推测,Apache Harmony实施版附带适用于大多数普通人的许可证。