Java:匹配两个字符串之间的标记并返回匹配标记的数量

时间:2012-09-04 09:36:37

标签: java string token

需要一些帮助才能找到两个字符串之间匹配的标记数。我有一个存储在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
  4. 我尝试过使用split string并将其存储到String []但String []是固定的,不允许缩小或添加新元素。尝试模式匹配但有灾难性的结果。尝试了一些其他的方法,但是我的嵌套for循环有一些问题..(如果有帮助,我会发布部分编码)。

    关于如何解决这个问题的任何建议或指示非常感谢。非常感谢你。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您是否尝试过使用Scanner

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

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。
  3. 如果您发现这一点令人困惑,我强烈建议您在浏览循环时列出i和j的值,从而在纸上进行处理。