2011-10-06 64 views
0

我有一个类Matcher(),如下所示。 find方法接受两个字符串:pattern(要查找的字符串)和source(要查找的字符串)。例如,如果pattern =“abc”和source =“abc cda abc”被传递给find方法。它返回[0 4],即在源的索引0和索引4处发现模式abc(精确匹配)。无论你传递给图案,它都会将该字符串视为一种图案。不修改以下匹配类,如果我想搜索多个模式。什么是最好的方式来做到这一点?例如,我想调用其他类的find方法,如果我有两个模式存储在arraylist然后我想先传递一个模式,并返回结果,并再次通过第二个模式,并在一次返回结果。我只想在源文件中查找arraylist中的模式或模式之后才停止处理。需要你的想法。字符串匹配如何实现

public class Matcher { 

    public static List<Integer> find(String pattern, String source) { 
     char[] x = pattern.toCharArray(), y = source.toCharArray(); 
     int i, j, m = x.length, n = y.length; 
     List<Integer> result = new ArrayList<Integer>(); 

     /* Searching */ 
     for (j = 0; j <= n - m; ++j) { 
      for (i = 0; i < m && x[i] == y[i + j]; ++i) 
       ; 
      if (i >= m) 
       result.add(j); 
     } 

     return result; 
    } 

} 
+0

我把索引4.应当0和8实施例,如果图案=“ABC”和源=“ABC CDA ABC”被传递给查找方法。它返回[0 8],即模式abc(精确匹配)在索引0和源索引8处找到。 –

回答

0

所以,你想你的方法find返回一个索引列表?你有没有看过String.indexOf?这可能正是你想要的。

+0

find方法已经返回索引列表。但查找方法只适用于一种模式。我的数据列表有3种模式。我想执行所有三种模式的查找方法。用于第一种模式的查找方法被调用并返回索引。那么我想为第二种模式做同样的事情,并返回索引等等。 –

+0

好的,假设你的模式在'List myPatterns'中,并且你的源代码在'source'中,为什么你不用:'for(String pattern:myPatterns){List results = Matcher.parse(pattern,source);/*处理结果* /}' –

+0

for(String pattern:Read.arrayList){List results = Matcher.find(pattern,source);的System.out.println(结果); } 我用上面的循环,现在它的工作和打印索引。但我不想打印索引,我想打印匹配的模式(字符串)。我应该添加什么代码才能打印匹配的字符串。感谢您的帮助 –

0

在我看来,你回答了你自己的问题。您需要在客户端代码中使用循环来重复调用find()方法。除非您重写您不想执行的查找方法,否则您将无法在一次调用中执行此操作。您的客户端代码被破坏的伪代码:

declare a Matcher object 
for (each pattern I want to match) 
    call the find method with the pattern and the source string 
    store the result 
end loop 

您如何处理结果将取决于您需要如何处理它。您可以创建一个ArrayList对象并将List对象附加到它。或者你可以创建一个HashMap,并使用该模式作为List对象的关键字,如果你需要知道哪个模式在哪里。

让我知道我是否完全错过了你的观点。

干杯, 院长

+0

for(String pattern:Read.arrayList){ List results = Matcher.find(pattern,source); System.out.println(results); \t \t \t} –

+0

我用上面的循环,现在它的工作和打印索引。但我不想打印索引,我想打印匹配的模式(字符串)。我应该添加什么代码才能打印匹配的字符串。 –

+0

您对'System.out.println(results)'的使用只是使用'ArrayList'中定义的默认'toString'方法来打印数组的内容。您将需要与结果分开打印模式,并且您需要编写一个嵌套循环来打印结果。例如:for(整数结果:结果){System.out.println(result); }格式化以满足您的显示需求。 – deanTheBean