Проверка, содержит ли строка в списке часть строки из другого списка, и возвращает уникальный список после обработки списка - PullRequest
0 голосов
/ 04 сентября 2018

processTest работает так, что если list contains первые три слова или последние три слова или средний текст из заголовка, он будет удален из modifiableList. Обратите внимание, count > 1L -> список должен содержать похожие слова более одного раза. Я ожидаю, что мой окончательный список будет похож на мой результат теста с 3 элементами, но я получаю результат с 4 элементами. В моем примере тестовые данные: Благодарим вас за помощь в выяснении проблемы или улучшении качества кода.

  1. проверка не совпадает с словами 1 xyz не совпадает с словами -> не должно быть в списке, соответствует первым трем словам, удалено

  2. тест без различий в тех же словах 1 xyz не не в тех же словах -> не должно быть в списке, соответствует последним трем словам, удалено

  3. тест первых трех слов 1 xyz не те же слова -> должен быть в списке

  4. тест первых трех слов 2 xyz последние три слова -> не должно быть в списке, соответствует последним трем / первым словам

  5. тест первых трех слов 3 xyz последние три слова -> не должно быть в списке, соответствует последним трем / первым словам

  6. первые три слова Тест 4 xyz последние три слова -> должно быть в списке

  7. разные слова Тест 5 xyz последние разные слова -> должен быть в списке

@Test
  public void processDataTest() {
    List<String> modifiableList = new ArrayList<>();
    modifiableList.add("not same words test 1 xyz not same words");
    modifiableList.add("not not same words test 1 xyz not not same words");
    modifiableList.add("not same words test 1 xyz not same words");
    modifiableList.add("first three words test 2 xyz last three words");
    modifiableList.add("first three words test 3 xyz last three words");
    modifiableList.add("first three words Test 4 xyz last three words");
    modifiableList.add("different words Test 5 xyz last different words");

    List<String> filteredList =
        new ArrayList<>(modifiableList)
            .stream()
            .filter(StringUtils::isNotEmpty)
            .filter(title -> !TextUtility.isThisUnicode(title, DEVANAGARI))
            .filter(title -> !isStringDuplicateOrSimilar(modifiableList, title))
            .collect(toList());
    Assert.assertEquals(3, filteredList.size());
    Assert.assertArrayEquals(
        filteredList.toArray(),
        new String[] {
          "first threes words test 1 xyz not same words",
          "first three words Test 4 xyz last three words",
          "different words Test 5 xyz last different words"
        });
  }


  private boolean isStringDuplicateOrSimilar(List<String> list, String title) {
    String[] splitStr = title.split(StringUtils.SPACE);
    String titleSubString = extractMiddleText(title);
    System.out.println(titleSubString);
    long count = list.stream().filter(containsSimilarWords(splitStr, titleSubString)).count();
    System.out.println(count);
    return list.removeIf(t -> t.equals(title) && count > 1L);
  }

// проверка, содержит ли заголовок средний текст или первые три слова заголовка или последние три слова заголовка

private static Predicate<String> containsSimilarWords(String[] splitStr, String titleSubString) {
    return title ->
        title.contains(titleSubString)
            || containsFirstThreeWords(title, splitStr)
            || containsLastThreeWords(title, splitStr);
  }

  public static boolean containsFirstThreeWords(String text, String[] words) {
    return words.length > 5
        && text.contains(words[0])
        && text.contains(words[1])
        && text.contains(words[2]);
  }

  public static boolean containsLastThreeWords(String text, String[] words) {
    int length = words.length;
    return words.length > 5
        && text.contains(words[length - 1])
        && text.contains(words[length - 2])
        && text.contains(words[length - 3]);
  }

  public static String extractMiddleText(String text) {
    int mid = text.length() / 2;
    String[] parts = {text.substring(0, mid), text.substring(mid)};
    int indexOfMidOfText2 = (parts[1].length() / 2) + parts[0].length();
    return text.substring(mid / 2, indexOfMidOfText2);
  }

1 Ответ

0 голосов
/ 04 сентября 2018

Как только индекс исправлен и используется обновленный пример (текст в вашем коде еще не обновлен), я получил только 2 прохождения, а пример № 6 отклонен. Это произошло потому, что логика для содержит совпадение слова three в примере № 6 с текстом first threes words... в примере № 3. Вы можете проверить это быстро, изменив текст threes на yam.

Если это нежелательно, вы можете использовать регулярные выражения с границей слова или просто разбить их и использовать наборы для поиска подходящих слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...