2012-11-10 7 views
5

Bir metin belgen ve bir sorgum var (sorgu birden fazla sözcük olabilir). Belgedeki sorgunun tüm oluşumlarının konumunu bulmak istiyorum.Bir String'deki tüm eşleşmelerin pozisyonları nasıl alınır?

documentText.indexOf(query)'u veya normal ifadeyi kullanmayı düşündüm ancak çalışamadım.

aşağıdaki yöntemi ile sona:

Birincisi, Sonra QueryOccurrence

public class QueryOccurrence implements Serializable{ 
    public QueryOccurrence(){} 
    private int start; 
    private int end;  

    public QueryOccurrence(int nameStart,int nameEnd,String nameText){ 
    start=nameStart; 
    end=nameEnd;   
    } 

    public int getStart(){ 
    return start; 
    } 

    public int getEnd(){ 
    return end; 
    } 

    public void SetStart(int i){ 
    start=i; 
    } 

    public void SetEnd(int i){ 
    end=i; 
    } 
} 

adında bir dataType oluşturmak var, şu yönteminde bu veri türü kullandık:

public static List<QueryOccurrence>FindQueryPositions(String documentText, String query){ 

    // Normalize do the following: lower case, trim, and remove punctuation 
    String normalizedQuery = Normalize.Normalize(query); 
    String normalizedDocument = Normalize.Normalize(documentText); 

    String[] documentWords = normalizedDocument.split(" ");;    
    String[] queryArray = normalizedQuery.split(" "); 


    List<QueryOccurrence> foundQueries = new ArrayList(); 
    QueryOccurrence foundQuery = new QueryOccurrence(); 

    int index = 0; 

    for (String word : documentWords) {    

     if (word.equals(queryArray[0])){ 
      foundQuery.SetStart(index); 
     } 

     if (word.equals(queryArray[queryArray.length-1])){ 
      foundQuery.SetEnd(index); 
      if((foundQuery.End()-foundQuery.Start())+1==queryArray.length){ 

       //add the found query to the list 
       foundQueries.add(foundQuery); 
       //flush the foundQuery variable to use it again 
       foundQuery= new QueryOccurrence(); 
      } 
     } 

     index++; 
    } 
    return foundQueries; 
} 

Bu yöntem, her birinde belgede bulunan sorgunun tüm durumlarının bir listesini döndürür.

Bu görevi gerçekleştirmenin daha kolay ve hızlı bir yolunu önerir misiniz?

Teşekkür

+0

Bu yardımcı olacaktır: ['String # indexOf (Dize, int)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28java. lang.String,% 20int% 29) –

cevap

12

İlk yaklaşım iyi bir fikir olduğunu, ancak String.indexOf normal ifadeleri desteklemez.

List<Integer> positions = new ArrayList(); 
Pattern p = Pattern.compile(queryPattern); // insert your pattern here 
Matcher m = p.matcher(documentText); 
while (m.find()) { 
    positions.add(m.start()); 
} 

pozisyonları maçların tüm başlangıç ​​mevkilere getirilecek Nerede şu şekildedir:

benzer bir yaklaşım kullanır, ancak iki aşamalı yöntemde başka daha kolay bir yoludur.

+0

Modelini almak için sorgudan (parametre olarak verilir) yeniden sorgudan çıkmanız gerekir. +1, iyi bir yaklaşım. –

+0

kodumdaki dizin, belgeyi boşluklarla belirlediğim ve eşleşmeyi bulmak için döngü içerdiği gibi kelimelerdi. Yaklaşımınız sözcüğün ilk harfinin indisini değil, kelimenin pozisyonunu verir. Regex, indeks yerine kelimenin konumunu bulmak için kullanılabilir. – user692704