Как проверить, находится ли каждое слово в одной строке в другой строке? - PullRequest
1 голос
/ 19 октября 2010

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

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

В этом списке TWO 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, соответствующее слово в строке searchTerms?

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

Чтобы найти полное соответствие, как вы его определили, вы хотите проверить, что набор токенов содержит определенное подмножество. Вы можете легко сделать это, используя 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). В вашем примере это сузило бы набор результатов до «Эрнест Хемингуэй - Старик и море»

1 голос
/ 19 октября 2010

Предполагая, что результат вашей базы данных точен,

Разделите 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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...