上下文:
我有一个文本文档,其中突出显示了一些句子。要定位高亮显示的零件,我有一个列表,其中包含高亮显示零件的开始和停止位置。要获得突出显示的部分,可以很容易地使用Java的string.substring(start, stop)
方法。然而,获取未高亮显示的部分是相当棘手的。
问题:
我的最终目标是标记文档中的文本,然后为每个标记指定一个标签,无论是否突出显示。因此,我最终需要的是有两个列表:1-一个列表包含高亮显示的文本块,2-另一个列表包括未高亮显示的文字块。然后,我会简单地在每个列表中分别标记每个块。
我面临的问题是找到一种干净的算法来提取未高亮显示的文本块。正如我所说,获取高亮显示的块很容易,因为您已经有了它们的开始和结束位置,并且可以使用Java的string.substring(start, stop)
方法。
例如:
This is a simple text, **this part is highlighted**, this part is not but **this is also highlighted,** but this one is also not.
因此,非突出显示的文本块列表应该包含:
1-This is a simple text,
2-, this part is not but
3-but this one is also not.
我的方法:
我解决这个问题的方法是将突出显示的部分的开始和结束位置添加到哈希表中,其中开始位置是键,值是结束位置。然后,我开始逐字符读取文本文档,并检查当前字符的位置是否是哈希表中的一个键,如果是,我将所有已读取的字符视为非高亮显示的文本块,并将其添加到非高亮显示文本块列表中。
然而,我发现我的方法有点丑陋,我想知道是否有更好的方法来做到这一点。我不擅长字符串算法,我认为可能有更好的方法。
所以我的问题:有更好的方法来找到未高亮显示的文本块吗?
将所有高亮显示位置放在一个列表中,并按起始位置对它们进行排序。对于列表中除最后一个高亮显示之外的每个高亮显示,都有一个非高亮显示区域,该区域从该高亮显示的结束位置开始,到下一高亮显示的开始位置结束。此外,除非第一个开始位置是0,否则存在从0到第一个开始的非高亮显示区域,对于最后一个高亮显示也是如此。
(这假设没有重叠的高光-如果有,您首先需要浏览列表并合并重叠的高光区。您可以通过检查一个高光区的结束是否在下一个高光区的开始之后来检测重叠。)
我的方法是弹出高亮显示文本的一对起始位置和结束位置,使起始位置最小。然后,我将构建一个新的对,表示到那时为止未高亮显示的文本的开始和结束位置。因此:
- 由于这是第一次迭代,first=0//first表示未高亮显示的文本的起始位置
- 突出显示地图中的弹出对(min_start,min_end)
- 构造对(第一个,min_start-1)并添加到未高亮显示的地图
- first=min_end//或者min_end+1(如果是闭合区间)
- 循环步骤2-4,直到高亮显示的地图为空
- 将最后一对(first,end_of_document)添加到列表中