2011-10-06 6 views
0

다음과 같이 Matcher() 클래스가 있습니다. find 메소드는 pattern (찾고자하는 문자열)과 source (찾으려는 문자열)의 두 문자열을 받아 들인다. 예 : pattern = "abc"및 source = "abc cda abc"가 메소드를 찾기 위해 전달됩니다. [0 4]를 반환합니다. 즉, 패턴 abc (완전 일치)가 소스의 인덱스 0 및 색인 4에서 발견됩니다. 무엇을 패턴으로 전달하든간에 문자열을 하나의 패턴으로 간주합니다. 둘 이상의 패턴을 검색하려면 다음 Matcher 클래스를 수정하지 않아도됩니다. 가장 좋은 방법은 무엇입니까? 예를 들어 다른 클래스의 find 메소드를 호출하고 arraylist에 두 개의 패턴이 저장되어 있다면 먼저 패턴 하나를 전달하고 결과를 반환하고 다시 두 번째 패턴을 전달하여 한 번에 결과를 반환하고 싶습니다. 나는 arraylist의 패턴이나 패턴을 소스에서 찾은 후에 만 ​​처리를 중단하고 싶습니다. 너의 생각이 필요해.String Match 구현 방법

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

건배, I 패턴 = "ABC"와 소스 = "ABC CDA ABC"방법을 찾기 위해 전달되는 경우 그것은 0 8 실시 예이어야 인덱스 4를 넣어. [0 8]을 반환합니다. 즉, 패턴 abc (완전 일치)가 소스 0의 인덱스 0과 인덱스 8에서 발견됩니다. –

답변

0

따라서 find 색인의 목록을 반환 하시겠습니까? String.indexOf을 보셨습니까? 그게 네가 원하는대로 할거야.

+0

find 메소드는 이미 인덱스 목록을 반환합니다. 그러나 find 메소드는 하나의 패턴에 대해서만 작동합니다. 내 arraylist 3 패턴이 있습니다. 세 가지 패턴 모두에 대해 find 메소드를 실행하려고합니다. 첫 번째 패턴 찾기 메서드가 호출되고 index를 반환합니다. 그럼 나는 두 번째 패턴과 반환 인덱스에 대해서도 동일하게하고 싶다. –

+0

여러분의 패턴이'List myPatterns'이고 소스가'source'에 있다고 가정하면, 다음과 같이하면됩니다 : for (String pattern : myPatterns) {List results = Matcher.parse (pattern, source);/* handle results * /}' –

+0

for (문자열 패턴 : Read.arrayList) {리스트 결과 = Matcher.find (패턴, 소스); System.out.println (결과); } 위의 루프를 사용했으며 이제는 작업 및 인쇄 색인을 사용했습니다. 하지만 색인을 인쇄하고 싶지 않습니다. 일치하는 패턴 (문자열)을 인쇄하고 싶습니다. 일치하는 문자열 만 인쇄하려면 코드에 무엇을 추가해야합니까? 도움 주셔서 감사합니다 –

0

당신이 당신의 질문에 대답 한 것처럼 보입니다. find() 메서드를 반복적으로 호출하려면 클라이언트 코드에서 루프를 사용해야합니다. 당신이하고 싶지 않은 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

(문자열 패턴 : Read.arrayList) { 목록 결과 = Matcher.find (pattern, source); System.out.println (results); \t \t \t} –

+0

나는 위의 루프를 사용했으며 이제는 작업 색인과 인쇄 색인을 사용했습니다. 하지만 색인을 인쇄하고 싶지 않습니다. 일치하는 패턴 (문자열)을 인쇄하고 싶습니다. 일치하는 문자열 만 인쇄하려면 코드에 무엇을 추가해야합니까? –

+0

'System.out.println (results)'을 사용하면'ArrayList'에 정의 된'toString' 메소드를 사용하여 배열의 내용을 출력 할 수 있습니다.결과와 별도로 패턴을 인쇄해야하며 결과를 인쇄하려면 중첩 루프를 작성해야합니다. 예를 들면 다음과 같습니다 (for Integer result : results) {System.out.println (result); }을 디스플레이 요구에 맞게 포맷 할 수 있습니다. – deanTheBean