2012-11-10 10 views
5

Mam dokument tekstowy i zapytanie (zapytanie może być więcej niż jednym słowem). Chcę znaleźć pozycję wszystkich wystąpień zapytania w dokumencie.Jak uzyskać pozycje wszystkich dopasowań w ciągu?

Pomyślałem o documentText.indexOf(query) lub używając wyrażenia regularnego, ale nie mogłem sprawić, żeby działało.

I skończyć z następującą metodą:

Po pierwsze, muszę utworzyć typ danych o nazwie 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; 
    } 
} 

Następnie użyłem tego typu danych w następujący sposób:

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; 
} 

Ta metoda zwraca listę wszystkich wystąpień zapytania w dokumencie, każdy z jego pozycją.

Czy możesz zaproponować jakiemuś easerowi i szybszy sposób na wykonanie tego zadania.

Dzięki

+0

Powinno to pomóc: ['String # indexOf (String, int)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28java. lang.String,% 20int% 29) –

Odpowiedz

12

Twoje pierwsze podejście było dobrym pomysłem, ale String.indexOf nie obsługuje wyrażeń regularnych.

Innym łatwiejszy sposób, który wykorzystuje podobne podejście, ale w sposobie dwuetapowym, przedstawia się następująco:

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()); 
} 

Gdzie pozycje odbędzie wszystkie pozycje rozpoczęcia meczów.

+0

Będziesz musiał użyć polecenia regex - uciec od zapytania (podanego jako parametr), aby uzyskać jego wzorzec. +1, dobre podejście. –

+0

Indeks w moim kodzie był dla słów, jak tokkenizowałem dokument spacjami i przeglądałem go, aby znaleźć dopasowanie. Twoje podejście daje indeks pierwszej litery słowa, a nie pozycji słowa. Czy Regex może być użyty do znalezienia pozycji słowa zamiast indeksu. – user692704