2010-10-19 4 views
1

Предположим, у меня есть название книги, и я ищу ее в базе данных. База данных создает совпадения, некоторые из которых являются полными совпадениями, а некоторые из них являются частичными совпадениями.Как вы проверяете, найдено ли каждое слово в одной строке в другой строке?

A full match есть, когда каждое слово в результатах поиска представлено словом в поисковых запросах.(i.e. there does not have to be a complete overlap on both sides)

Меня интересует только поиск матчей.

Так что, если я типа поиска для "Ernest Hemingway - The Old Man and the Sea" и результаты возвращают следующее:

Charles Nordhoff - Men Against The Sea 
Rodman Philbrick - The Young Man and the Sea 
Ernest Hemingway - The Old Man and the Sea 
Ernest Hemingway - The Sun Also Rises 
Ernest Hemingway - A Farewell to Arms 
Ernest Hemingway - For Whom the Bell Tolls 
Ernest Hemingway - A Moveable Feast 
Ernest Hemingway - True at First Light 
Men Against The Sea 
The Old Man and the Sea 
The Old Man and the Sea Dog 

Есть ДВАfull matches в этом списке: (в соответствии с приведенным выше определением)

Ernest Hemingway - The Old Man and the Sea 
The Old Man and the Sea 

Чтобы сделать это на Java, предположим, что у меня есть две переменные:

String searchTerms; 
List<String> searchResults; 

searchTerms в примере выше, представляет собой то, что я напечатал: Ernest Hemingway - The Old Man and the Sea

searchResults представляет собой список строк, которые я получил обратно из вышеприведенных баз данных.

for (String result : searchResults) { 
    // How to check for a full match? 
    // (each word in `result` is found in `searchTerms` 
} 

Мой вопрос: в этом for-loop, как я могу проверить, имеет ли каждое слово в result String, соответствующее слово в searchTerms String?

ответ

1

Если предположить, что результат базы данных является точной,

дробить result в токенов (слов) с помощью String.split(String delimiter) и посмотреть, будет ли каждый маркер находится в searchTerms (используя searchTerms.indexOf(String word) == -1).

for (String result : searchResults) { 
    for(String word : result) { 
     if(searchTerms.indexOf(word) == -1) { 
      // result is not a full match 
     } 
    } 

    //If none of the if statements executed, statement is a full match. 
} 
3

Чтобы найти полное совпадение, так как вы его определили, вы хотите проверить, что набор токенов содержит определенное подмножество. Вы можете сделать это легко, используя Set, который вы получите бесплатно в библиотеках коллекций. Один из способов сделать это будет (расход регулярных выражений в сторону):

Set<String> searchTerms = new HashSet<String>(); 
    Set<String> resultTokens = new HashSet<String>(); 

    searchTerms.addAll(Arrays.asList(searchString.split("\\s+")); 

    for (String result : searchResults) 
    { 
     resultTokens.clear(); 
     resultTokens.addAll(Arrays.asList(result.split("\\s+"))); 
     if (resultTokens.containsAll(searchTerms)) 
     { 
     // Perform match code 
     } 
    } 

В качестве альтернативы, если вы хотите быть строже об этом, вы можете проверить на множестве равенства с помощью resultTokens.equals (searchTerms). В вашем примере это сузило бы результирующий набор к «Эрнест Хемингуэй - Старик и Море»

Смежные вопросы