2009-07-06 41 views
4

我需要操纵Java中的大型字符串(删除并再次删除并添加删除的 字符,移动字符),但仍想记住原始位置偏移量 。例如。 “计算机”这个词在原始文本中起始于偏移量 133,然后移动到位置244,我仍然要 想要它的信息最初在位置133. 最丑陋的(和资源饥饿的)解决方案将是存储为 每个角色的原始位置加上它的位置变化。 肯定是更好的解决方案,但也是更复杂的解决方案。 是否有任何良好的文本操作库,有我的问题的解决方案 ?我不想重新发明轮子。文本操作,同时保持原始位置偏移

问候, 凯

+0

这是为了实现某种撤销/重做功能? – 2009-07-06 11:12:33

+0

某种。它是基于Eclipse RCP构建的文本分析应用程序的一部分。例如,用户可以选择仅查看文档的重要内容,然后再查看整个文档。问题在于文本高于文本上方的高亮和图形边缘。所以重要的是要记住原来的位置以知道在哪里绘制这些东西。 – Zardoz 2009-07-07 23:00:42

回答

2

这些字符串有多大?鉴于今天可用的内存数量,蛮力可能是一条可行的路。

你谈论的是移动单词,但存储字符位置。为什么不存储单词位置,以及每个单词的历史记录。请注意,您可能很聪明,并使用flyweight pattern来保存这些对象的多个实例直到您需要。即你的“字符串”对象包含一个“计算机”字对象,但记录该字出现在位置133,245,667等处(加上历史记录,当你需要它时)

1

你指的问题是正式名称为“String-to-string correction problem”这是关系到Delta EncodingLevenshtein DistanceHere是计算距离的代码(它是用Java编写的)。所有的差异代码都在那里,你只需添加跟踪步骤的代码,以便反转或跟踪它们。注意:“移动”一个单词或字符应该是一起出现的同一单词的删除/插入对。

这应该适用于字符,单词和子串移动。

+0

好点,但我不认为我需要计算Levenshtein距离,因为我已经知道编辑内容。例如,如果在文档内删除了某些内容,我总是会得到“通知”。 – Zardoz 2009-07-07 23:03:30

0

在强调效率之前,做一个信封计算的背面。当你没有问题并且有代码时,你可以再次使用探查器/秒表进行检查。

有一个现成的解决方案的形式的Swing文本。它应该可以在Swing环境之外使用,尽管IIRC试图在EDT上触发异常(以典型的Swing线程 - 敌对的方式) - 可能需要检查该异常。即使在插入和删除之后,仍有Position对象跟踪Document内的字符位置。如果没有别的,它会显示如何完成。据推测,Apache Harmony实施带有适用于大多数普通人的许可证。