Цель-C: Сравнивать массив строк с введенной пользователем строкой, а затем возвращать соответствующее значение? - PullRequest
1 голос
/ 07 февраля 2012

Это вопрос о программировании на iOS с Objective C.

У меня есть NSMutableArray строк "csvContent", которые были проанализированы из файла CSV, который содержал псевдобазу вопросов, ответов и ключевых слов. Содержимое файла CSV было следующим:

ID #, «Вот вопрос, который я задаю?», «[Вопрос, ключ, слова]», «Это ответ на ваш вопрос».

Существует около 2000 таких вопросов и связанных с ними ключевых слов и ответов, и я успешно разбил их в массив, строка за строкой, чтобы каждый элемент содержал все в примере, который вы видите выше.

Мой вопрос заключается в том, что если я хочу, чтобы пользователь задал вопрос в UITextField, а затем сравнил UserQuestion и нашел наиболее похожий вопрос в моем массиве строк, а затем возвратил его ответ, что было бы лучшим способом? об этом? Я просмотрел документацию о расстоянии Левенштейна и думаю, что это было бы хорошим вариантом, но не знаю, как точно реализовать его и сделать так, чтобы он перебирал весь мой массив CSVContent. Я не ищу точный код, но идеальный ответ будет содержать некоторый псевдокод или методологию, как это сделать.

Подведем итог:

  • Массив строк, CSVContent, внешнего вида: [id, "question", ("ключевые слова вопроса"), "answer"].

  • У меня есть UITextField, где я могу разобрать введенный пользователем вопрос в строку UserQuestion.

  • Я хочу использовать алгоритм быстрого сравнения (Левенштейн?), Чтобы сравнить UserQuestion с элементами внутри CSVContent и найти соответствующий вопрос и связанный с ним ответ, а затем вернуть ответ.

1 Ответ

0 голосов
/ 08 февраля 2012

Когда пользователь нажимает кнопку «Поиск», передайте textField.text этому методу:

 - (int)matchingIDForString:(NSString *)userSuppliedText {

      NSInteger bestLevDistanceSoFar = 9999999;
      int       indexOfMatch=-1;
      // having to search the entire array each time is, of course, scary.
      for ( int j=0; j<[myMutableArray count]; j++ ) {
         NSString *candidateAnswer = [myMutableArray objectAtIndex:j];
         // if candidateAnswer is a string, just use it.  Else extract the member you want...
         NSInteger *levDistance = [self myLevensteinDistanceMethod:candidateAnswer
                                                         forstring:userSuppliedText];
         if ( levDistance < bestLevDistanceSoFar ) {
            indexOfMatch = j;
            bestLevDistanceSoFar = levDistance;
         }
      }
      return indexOfMatch;   // called should test for <0 meaning no match
 }

Вам также потребуется реализовать этот метод:

 - (NSInteger *)myLevensteinDistanceMethod:(NSString *)string1 forString:(NSString *)string2 {
     // calculate the lev distance, and return it as an NSInteger *.
 }
...