0

需要一些帮助来查找两个字符串之间的匹配标记数。我有一个存储在 ArrayList 中的字符串列表(下面给出的示例):

Line 0 : WRB VBD NN VB IN CC RB VBP NNP  
Line 1 : WDT NNS VBD DT NN NNP NNP  
Line 2 : WRB MD PRP VB DT NN IN NNS POS JJ NNS  
Line 3 : WDT NN VBZ DT NN IN DT JJ NN IN DT NNP  
Line 4 : WP VBZ DT JJ NN IN  NN  

在这里,您可以看到每个字符串由一堆用空格分隔的标记组成。所以,我需要处理三件事..

  1. 将第 0 行中的第一个标记 (WRB) 与第 1 行中的标记进行比较,以查看它们是否匹配。移动到第 0 行中的下一个标记,直到找到匹配项。如果匹配,则在第 1 行中标记匹配的标记,使其不会再次匹配。
  2. 返回第 0 行和第 1 行之间匹配的标记数。
  3. 返回匹配标记的距离。示例:在第 0 行的第 3 位和第 1 行的第 5 位找到令牌 NN。距离 = |3-5| = 2

我尝试使用拆分字符串并将其存储到 String[] 但 String[] 是固定的,不允许缩小或添加新元素。尝试过模式匹配器,但结果很糟糕。尝试了其他一些方法,但我的嵌套 for 循环存在一些问题..(如果有帮助,将发布我的部分编码)。

任何有关如何解决此问题的建议或指示将不胜感激。非常感谢你。

4

2 回答 2

0

以不同的方式思考任务。您想要扫描标记(因此:扫描仪),并且您想要匹配标记(因此:列表,因为您需要顺序。)然后您将遍历每个标记的不同集合,注意匹配和距离.

于 2012-09-04T09:38:41.287 回答
0

您是否尝试过使用扫描仪

如果没有,完全这样做。它看起来像这样:

String line1 = ... // your line 1
String line2 = ... // your line 2
Scanner s1 = new Scanner(line1); 

int i1 = 0;
while (s1.hasNext()) {
    String token1 = s1.next();
    Scanner s2 = new Scanner(line2);

    int i2 = 0;
    while (s2.hasNext()) {
        String token2 = s2.next();

        // now you have token1, token2 and their positions (i1, i2)
        // do whatever you want with them

        i2++;
    } // end reading line2
    i1++;
} // end reading line1

编辑:关于在 Arraylist 中选择不同行的循环,您需要将每个数组元素与每个其他数组元素进行比较(如果缺少这种解释,这可能是谷歌的最佳选择)。

在 Java 中看起来像这样:

for (int i = 0; i < thearraylist.size()-1; i++) {
    for (int j = i+1; j < thearraylist.size(); j++) {

        // now the elements and indices i and j are compared
        // if we were running into my code above:

        String line1 = thearraylist.get(i);
        String line2 = thearraylist.get(j);

        // ... and then compare them

     }
}

第二个循环从 i+1 开始的原因是为了消除这些不必要的比较:

  1. 每个元素都会在 j=i 的每个点上与自身进行比较,这是无用的。在上面的循环中,j 从 i+1 开始并增加,所以它永远不会等于 i。
  2. 每对元素将被比较两次。例如,当 i=0, j=1 时,您正在比较前两个元素。当 i=1, j=0 时,您也在比较前两个元素。这使得第二个比较变得多余。为了摆脱第二个“向后”比较,我们坚持 j 总是高于 i。

如果您觉得这令人困惑,我强烈建议您在循环中通过列出 i 和 j 的值在纸上解决它。

于 2012-09-04T10:20:31.197 回答