2011-10-06 69 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