【问题标题】:Java: Match tokens between two strings and return the number of matched tokensJava:在两个字符串之间匹配标记并返回匹配标记的数量
【发布时间】:2012-08-28 22:42:18
【问题描述】:

需要一些帮助来查找两个字符串之间的匹配标记数。我有一个存储在 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 循环存在一些问题..(如果有帮助,将发布我的部分编码)。

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

【问题讨论】:

  • 相信我,这是一个算法问题,而不是一个编程问题,因为当字符串长度很大时,蛮力方法需要很长时间。

标签: java string token


【解决方案1】:

您是否尝试过使用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。

如果您觉得这很混乱,我强烈建议您在循环中列出 i 和 j 的值,在纸上解决它。

【讨论】:

  • 不,我没有尝试使用扫描仪。从来没想过。我会试一试。我还需要仔细处理一个复杂的嵌套循环。
  • 酷!标准嵌套循环不满足循环要求吗? for (line1 中的每个标记) { for (line2 中的每个标记) { /* 执行 */ } } ..?
  • 实际上我不擅长循环,但我需要一个循环来比较第 0 行和第 1 行,然后第 0 行和第 2 行,..第 0 行和第 n-1 行,然后第 1 行与第 2 行,依此类推。起初我做了一个嵌套循环,然后我被困在试图比较循环内的行,因为我的行存储在一个 ArrayList 中。
  • 哦,我明白了。将其添加到帖子中,如果不清楚,请告诉我。
  • 嘿 chm052,我把 for 循环的那部分搞定了。我设法用你给我的结构做点什么。我实际上发布了一个不同的问题,因为我现在在扫描每一个事件而不是第一个事件时遇到问题。你可以在这里查看我的代码:stackoverflow.com/questions/12279214/…
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-10-07
    • 2019-10-21
    • 2015-04-24
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多