processTest
работает так, что если list
contains
первые три слова или последние три слова или средний текст из заголовка, он будет удален из modifiableList
. Обратите внимание, count > 1L
-> список должен содержать похожие слова более одного раза.
Я ожидаю, что мой окончательный список будет похож на мой результат теста с 3 элементами, но я получаю результат с 4 элементами. В моем примере тестовые данные:
Благодарим вас за помощь в выяснении проблемы или улучшении качества кода.
проверка не совпадает с словами 1 xyz не совпадает с словами -> не должно быть в списке, соответствует первым трем словам, удалено
тест без различий в тех же словах 1 xyz не не в тех же словах -> не должно быть в списке, соответствует последним трем словам, удалено
тест первых трех слов 1 xyz не те же слова -> должен быть в списке
тест первых трех слов 2 xyz последние три слова -> не должно быть в списке, соответствует последним трем / первым словам
тест первых трех слов 3 xyz последние три слова
-> не должно быть в списке, соответствует последним трем / первым словам
первые три слова Тест 4 xyz последние три слова -> должно быть в списке
разные слова Тест 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);
}