Сравнить строку с массивом строк и вывести наиболее полные совпадения - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени! Задачку решил на своем уровне знания, но код получился ППЦ тяжелый, некрасивый, и жрущий память. Помогите переделать/оптимизировать. Вводные данные: Есть строка, состоящая из нескольких слов (от 1 до 10). Есть массив из подобных строк. Есть слова-исключения. Задача: Сравнить исходную строку с каждой из массива, выбрать те, в которой совпадает максимальное количество слов, не учитывая слова-исключения. Мой код (постарался максимально откомментировать):
Листинг программы
  1. Imports System.Text.RegularExpressions
  2. Module String_select
  3. Public one_str As String = "Вася ел бутерброд с маслом" ' строка для поиска
  4. Public other_strings = {
  5. "Петя ел кашу с маслом",
  6. "Вася кашу с маслом тоже ел",
  7. "Петя бутерброд с икрой уронил",
  8. "Вася бутерброд с маслом уронил",
  9. "Петя ел бутерброд с маслом"} 'массив строк в которых искать совпадения
  10. Public iskl_word As String() = {"Вася", "Петя"} 'слова не участвующие в поиске, слова-исключения
  11. Public str1 As String = "не найдено"
  12.  
  13. Sub Main()
  14. Dim k_mn As Integer 'коэффициент множественного совпадения (если результат не одна строка, а несколько)
  15. Dim k_t(0) As Integer ' массив номеров строк при множественном совпадении
  16. Dim ResultStr As String = "" 'вывод результата при множественном совпадении
  17. Dim k As Integer
  18. Dim s As Integer
  19. Dim s1 As Integer = 0
  20. Dim rg As Regex = New Regex("([А-Яа-я-]+)") 'любое слово
  21. Dim rg_m As MatchCollection = rg.Matches(one_str) 'Коллекция из СОВПАДЕНИЙ отдельных слов в исходной строке
  22. Dim n As Integer = rg_m.Count 'количество отдельных слов в one_str
  23. Dim rg_new(n) As Regex ' коллекция из ОТДЕЛЬНЫХ СЛОВ в исходной строке (для сравнения)
  24. Dim rg_fin As Match
  25.  
  26. For index = 0 To other_strings.GetUpperBound(0) ' от 0 до количества строк в массиве, цикл по каждой отдельной строке из other_string
  27. For index1 = 0 To n - 1 ' от 0 до размера коллекции слов -1 , цикл по каждому отдельному слову в исходной строке
  28. str1 = rg_m.Item(index1).Value
  29. rg_new(index1) = New Regex(str1) ' заполняем коллекцию из отдельных слов
  30. If Array.FindIndex(iskl_word, AddressOf check_element) < 0 Then 'проверяем на слова-исключения
  31. rg_fin = rg_new(index1).Match(other_strings(index)) ' параллельно ищем совпадения по каждому слову из one_str в строке из other_string
  32. If rg_fin.Success = True Then 'если есть совпадение
  33. s = s + 1 'накручиваем счетчик совпадений
  34. End If
  35. End If
  36. Next
  37. If s > s1 Then ' если количество совпадений в данной строке больше максимального в предыдущих
  38. k_mn = 0 'обнуляем множественное совпадение
  39. s1 = s ' максимальное количество совпадений равно текущему
  40. k = index ' номер строки с максимальным совпадением
  41. k_t.SetValue(k, 0) ' делаем массив 1х1 (0 - индекс)
  42. ReDim Preserve k_t(0)
  43. ElseIf s = s1 Then ' если одинаковое количество совпадений
  44. k_mn = 1 ' задействуем коэффициент множественного совпадения
  45. ReDim Preserve k_t(k_t.Length) ' увеличиваем длину массива с номерами строк совпадений
  46. k_t.SetValue(index, k_t.GetUpperBound(0))
  47. End If
  48. s = 0
  49. Next
  50. If k_mn = 0 Then 'если одна строка имеет максимальное совпадение
  51. ResultStr = other_strings(k)
  52. Else 'если несколько строк имеют максимальное совпадение
  53. For j = 0 To k_t.GetUpperBound(0)
  54. ResultStr = ResultStr & other_strings(k_t(j)) & vbCrLf
  55. Next
  56. End If
  57. MsgBox(ResultStr)
  58. End Sub
  59. Private Function check_element(ByVal str As String) As Boolean
  60. Dim result As Boolean = False
  61. If str.Equals(str1) Then result = True
  62. Return result
  63. End Function
  64. End Module

Решение задачи: «Сравнить строку с массивом строк и вывести наиболее полные совпадения»

textual
Листинг программы
  1. Public one_str As String = "Вася ел бутерброд с маслом" ' строка для поиска
  2. Public other_strings() As String = {
  3.  "Петя ел кашу с маслом",
  4.  "Вася кашу с маслом тоже ел",
  5.  "Петя бутерброд с икрой уронил",
  6.  "Вася бутерброд с маслом уронил",
  7.  "Петя ел бутерброд с маслом"} 'массив строк в которых искать совпадения
  8. Public iskl_word As String() = {"Вася", "Петя"} 'слова не участвующие в поиске, слова-исключения
  9. Public str1 As String = "не найдено"
  10. Private delim As Char = " "c
  11. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
  12.     Dim sPattern() As String = exWordDeletion(one_str, iskl_word).Split(delim)
  13.     Dim nnS(other_strings.Length - 1) As Integer
  14.     Dim sSource As String
  15.     For i = 0 To other_strings.Length - 1
  16.         sSource = exWordDeletion(other_strings(i), iskl_word)
  17.         nnS(i) = sWordEqualCount(sSource, sPattern)
  18.     Next
  19.     MsgBox("Максимальное число совпадений = " & nnS.Max & vbCrLf & "в строке: " & other_strings(Array.IndexOf(nnS, nnS.Max)))
  20. End Sub
  21. Private Function exWordDeletion(ByVal sSrc As String, ByVal sEx As String()) As String
  22.     Dim wSrc() As String = sSrc.Split(delim)
  23.     Dim rz() As String = wSrc.Except(sEx).ToArray
  24.     Return String.Join(delim, rz)
  25. End Function
  26. Private Function sWordEqualCount(ByVal sSrc As String, ByVal sPtn As String()) As Integer
  27.     Dim wSrc() As String = sSrc.Split(delim)
  28.     Dim rz() As String = wSrc.Intersect(sPtn).ToArray
  29.     Return rz.Count
  30. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы