Перевірте, чи є рядок Pangram у Java

1. Огляд

У цьому підручнику ми навчимося перевіряти, чи є даний рядок дійсним pangram чи не за допомогою простої програми Java. Панграма будь-який рядок , яка містить всі літери заданого набору алфавіту , по крайней мере один раз.

2. Панграми

Панграми застосовуються не лише до англійської мови, але й до будь-якої іншої мови, що має фіксований набір символів.

Наприклад, загальновідома англійська панграма - «Швидкий бурий лис стрибає над ледачим собакою». Подібним чином вони доступні й іншими мовами.

3. Використання for для Loop

Спочатку спробуємо цикл for . Ми заселити булеву масив з маркерами для кожного символу алфавіту.

Код повертає true, коли всі значення в масиві маркерів мають значення true :

public static boolean isPangram(String str) { if (str == null) { return false; } Boolean[] alphabetMarker = new Boolean[ALPHABET_COUNT]; Arrays.fill(alphabetMarker, false); int alphabetIndex = 0; str = str.toUpperCase(); for (int i = 0; i < str.length(); i++) { if ('A' <= str.charAt(i) && str.charAt(i) <= 'Z') { alphabetIndex = str.charAt(i) - 'A'; alphabetMarker[alphabetIndex] = true; } } for (boolean index : alphabetMarker) { if (!index) { return false; } } return true; }

Давайте перевіримо нашу реалізацію:

@Test public void givenValidString_isPanagram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; assertTrue(Pangram.isPangram(input)); }

4. Використання Java Streams

Альтернативний підхід передбачає використання API Java Streams. Ми можемо створити відфільтрований потік символів із заданого вхідного тексту та створити алфавітну карту за допомогою потоку .

Код повертає успіх, якщо розмір Карти дорівнює розміру алфавіту. Для англійської мови очікуваний розмір - 26:

public static boolean isPangramWithStreams(String str) { if (str == null) { return false; } String strUpper = str.toUpperCase(); Stream filteredCharStream = strUpper.chars() .filter(item -> ((item >= 'A' && item  (char) c); Map alphabetMap = filteredCharStream.collect(Collectors.toMap(item -> item, k -> Boolean.TRUE, (p1, p2) -> p1)); return alphabetMap.size() == ALPHABET_COUNT; }

І, звичайно, давайте перевіримо:

@Test public void givenValidString_isPangramWithStreams_shouldReturnSuccess() { String input = "The quick brown fox jumps over the lazy dog"; assertTrue(Pangram.isPangramWithStreams(input)); }

5. Модифікація для Perfect Pangrams

Ідеальна панграма трохи відрізняється від звичайної панграми. Ідеально панграма складається з однієї літери алфавіту рівно один раз , на відміну від по крайней мере , один раз за панграма.

Код повертає істину, коли розмір Карти дорівнює розміру алфавіту, а частота кожного символу в алфавіті рівна одиниці:

public static boolean isPerfectPangram(String str) { if (str == null) { return false; } String strUpper = str.toUpperCase(); Stream filteredCharStream = strUpper.chars() .filter(item -> ((item >= 'A' && item  (char) c); Map alphabetFrequencyMap = filteredCharStream.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); return alphabetFrequencyMap.size() == ALPHABET_COUNT && alphabetFrequencyMap.values().stream().allMatch(item -> item == 1); }

І давайте перевіримо:

@Test public void givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess() { String input = "abcdefghijklmNoPqrStuVwxyz"; assertTrue(Pangram.isPerfectPangram(input)); }

Ідеальна панграма повинна мати кожного символу рівно один раз. Отже, наша попередня панграма повинна вийти з ладу:

String input = "Two driven jocks help fax my big quiz"; assertFalse(Pangram.isPerfectPangram(input));

У наведеному вище коді введений рядок має кілька дублікатів, як і два о. Отже, результат є хибним .

5. Висновок

У цій статті ми розглянули різні підходи до вирішення, щоб з’ясувати, чи є даний рядок дійсною панграмою чи ні.

Ми також обговорили ще один смак панграм, який називається ідеальною панграмою, і те, як її програмно визначити.

Зразок коду доступний на GitHub.