fix: sonarQube замечания

This commit is contained in:
Максименко Никита Владимирович
2026-09-23 09:55:48 +03:00
parent 1cee7d0f0f
commit f0e9c6c60c
7 changed files with 46 additions and 112 deletions
@@ -51,6 +51,9 @@ public final class NameDictionary {
private static final Path EXTERNAL_FILE = Path.of("config/well-known.txt");
/** Разделитель слов: любая последовательность не-буквенных символов. */
private static final String WORD_SPLIT = "\\P{L}+";
/** Порядковые числительные в имени правителя: «Пётр Первый», «Екатерина Вторая». */
private static final String REGNAL_ORDINALS =
"перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят|десят";
@@ -111,7 +114,7 @@ public final class NameDictionary {
* приходится не больше четырёх обращений к хеш-таблице.
*/
public static boolean containsGivenName(String value) {
for (String word : value.split("\\P{L}+")) {
for (String word : value.split(WORD_SPLIT)) {
String lower = word.toLowerCase(Locale.ROOT);
// Точное совпадение с основой сильнее всего: «Яков» оканчивается на «ов»,
// но это имя, а не фамилия.
@@ -138,7 +141,7 @@ public final class NameDictionary {
* не подсказывает, что перед нами имя.
*/
public static boolean containsNamePart(String value) {
for (String word : value.split("\\P{L}+")) {
for (String word : value.split(WORD_SPLIT)) {
String lower = word.toLowerCase(Locale.ROOT);
if (GIVEN_NAMES.contains(lower)) {
return true;
@@ -155,9 +158,19 @@ public final class NameDictionary {
return lower.matches(".*(?:ович|евич|овна|евна|ична|ичн)$");
}
/** Фамилия по словообразованию: Иванов, Петрова, Троицкий, Шевченко. */
/** Окончания, по которым слово похоже на фамилию: Иванов, Петрова, Троицкий, Шевченко. */
private static final Set<String> SURNAME_ENDINGS = Set.of(
"ов", "ев", "ёв", "ин", "ын", "ский", "ская", "ского", "ской", "ском",
"цкий", "цкая", "енко", "ко", "ук", "юк", "ян", "швили", "дзе");
/** Фамилия по словообразованию. Набор окончаний вместо regex: проще и без CANON_EQ. */
private static boolean isSurname(String lower) {
return lower.matches(".*(?:ов|ев|ёв|ин|ын|ск(?:ий|ая|ого|ой|ом)|цк(?:ий|ая)|енко|ко|ук|юк|ян|швили|дзе)$");
for (String ending : SURNAME_ENDINGS) {
if (lower.endsWith(ending)) {
return true;
}
}
return false;
}
/**
@@ -174,7 +187,7 @@ public final class NameDictionary {
return true;
}
Set<String> stems = currentWellKnownStems();
for (String word : value.split("\\P{L}+")) {
for (String word : value.split(WORD_SPLIT)) {
String lower = word.toLowerCase(Locale.ROOT);
for (int length = lower.length(); length > 0; length--) {
if (stems.contains(lower.substring(0, length))) {
@@ -235,7 +248,6 @@ public final class NameDictionary {
}
}
return Set.copyOf(merged);
},
BUNDLED_WELL_KNOWN_STEMS);
});
}
}