从半高亮显示的文本中获取非突出显示文本的更好算法

时间:2015-06-24 18:55:55

标签: java string algorithm

上下文

我有一个文本文档,其中突出显示了一些句子。为了找到突出显示的部分,我有一个列表,其中包含突出显示部分的开始和停止位置。要获得突出显示的部分,可以轻松使用Java的Buttons方法。但是,获取非突出显示的部分非常棘手。

问题:

我的最终目标是对文档中的文本进行标记,然后为每个标记指定标签,或者突出显示。因此,我最终需要的是有两个列表:1-一个包含突出显示的文本块的列表,另一个包含未突出显示的文本块的列表。然后,我会简单地在每个列表中单独标记每个块。

我面临的问题是找到一个干净的算法来提取非突出显示的文本块。正如我所说,获得突出显示的块很容易,因为你已经有了它们的开始和结束位置,你可以使用Java的string.substring(start, stop)方法。

例如:

string.substring(start, stop)

因此,未突出显示的文本块列表应包含:

1 - This is a simple text, **this part is highlighted**, this part is not but **this is also highlighted,** but this one is also not.

2- This is a simple text,

3- , this part is not but

我的方法:

我解决这个问题的方法是将突出显示部分的开始和结束位置添加到哈希表中,其中起始位置是键,值是结束位置。然后我开始逐个字符地阅读文本文档并检查当前字符的位置是否是哈希表中的键,如果是,我将所有已读取的字符视为非突出显示的文本块并将其添加到非突出显示的文本块列表。

然而,我发现我的方法有点难看,我想知道是否有更好的方法来做到这一点。我不擅长字符串算法,并认为可能有更好的方法。

所以我的问题:是否有更好的方法来查找未突出显示的文本块?

2 个答案:

答案 0 :(得分:1)

将所有突出显示位置放在列表中,然后按起始位置对其进行排序。对于除最后一个之外的列表中的每个突出显示,有一个非突出显示的区域从该突出显示的结束位置开始,并在后续突出显示的开始位置结束。此外,除非第一个开始位置为0,否则会有一个从0到第一个开始的非高亮显示区域,并且类似于最后一个高亮区域。

(这假设没有重叠的高光 - 如果有,你首先需要浏览列表并合并重叠的高光。你可以通过检查一个高光的结尾是否在后续高光开始之后检测到重叠。)

答案 1 :(得分:0)

我这样做的方法是弹出突出显示文本的一对开始和结束位置,使得start是最小的。然后我将构建一个新的对,它代表那个点上未突出显示的文本的开始和结束位置。所以:

  1. 由于这是第一次迭代,first = 0 //首先表示未突出显示文本的开始位置
  2. 突出显示的地图中的流行对(min_start,min_end)
  3. 构造对(第一个,min_start - 1)并添加到无法突出显示的地图
  4. first = min_end //或min_end + 1如果是关闭间隔
  5. 循环步骤2-4,直到突出显示的地图为空
  6. 将最终对(first,end_of_document)添加到列表