Перейти к основному содержимому

Символ#isАлфавитный и Символ#isПисьмо

· 6 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

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

Далее мы рассмотрим методы isAlphabetic () и isLetter() класса Character в Java. Наконец, мы рассмотрим сходства и различия между этими методами.

2. Типы общих категорий символов Unicode

Набор символов Unicode (UCS) содержит 1 114 112 кодовых точек: от U+0000 до U+10FFFF. Символы и диапазоны кодовых точек сгруппированы по категориям.

Класс Character предоставляет две перегруженные версии метода getType () , который возвращает значение, указывающее тип общей категории персонажа .

Посмотрим на сигнатуру первого метода:

public static int getType(char ch)

Этот метод не может обрабатывать дополнительные символы. Для обработки всех символов Юникода, включая дополнительные символы, класс символов Java предоставляет перегруженный метод getType со следующей сигнатурой:

public static int getType(int codePoint)

Далее давайте рассмотрим некоторые общие типы категорий.

2.1. ПРОПИСНАЯ БУКВА

Тип общей категории UPPERCASE_LETTER представляет буквы верхнего регистра.

Когда мы вызываем метод getType Character # для буквы верхнего регистра, например, ' U ', метод возвращает значение 1, что эквивалентно значению перечисления UPPERCASE_LETTER : ``

assertEquals(Character.UPPERCASE_LETTER, Character.getType('U'));

2.2. СТРОЧНАЯ БУКВА

Тип общей категории LOWERCASE_LETTER связан со строчными буквами.

При вызове метода getType Character # для строчной буквы, например, ' u ', метод вернет значение 2, которое совпадает со значением перечисления LOWERCASE_LETTER : ``

assertEquals(Character.LOWERCASE_LETTER, Character.getType('u'));

2.3. TITLECASE_LETTER

Затем общая категория TITLECASE_LETTER представляет символы регистра заголовков.

Некоторые символы выглядят как пары латинских букв. Когда мы вызываем метод getType Character # для таких символов Unicode, он возвращает значение 3, равное значению перечисления TITLECASE_LETTER :

assertEquals(Character.TITLECASE_LETTER, Character.getType('\u01f2'));

Здесь символ Unicode ' \u01f2 ' представляет собой латинскую заглавную букву ' D ', за которой следует маленькая буква ' Z ' с кароном.

2.4. MODIFIER_LETTER

Буква-модификатор в стандарте Unicode — это «буква или символ, обычно написанный рядом с другой буквой, которую он каким-то образом изменяет» .

Тип общей категории MODIFIER_LETTER представляет такие буквы-модификаторы.

Например, буква модификатора small H , ' ʰ ', при передаче в метод Character # getType возвращает значение 4, которое совпадает со значением перечисления MODIFIER_LETTER :

assertEquals(Character.MODIFIER_LETTER, Character.getType('\u02b0'));

Символ Unicode ' \u020 ' представляет маленькую букву H модификатора .

2.5. OTHER_LETTER

Тип общей категории OTHER_LETTER представляет собой идеограмму или букву в алфавите с уникальным регистром. Идеограмма — это графический символ, представляющий идею или понятие, независимое от какого-либо конкретного языка.

Уникальный алфавит имеет только один регистр для букв. Например, иврит — это система письма с уникальным регистром.

Давайте посмотрим на пример еврейской буквы Алеф, ' א ', когда мы передаем ее методу Character # getType , он возвращает значение 5, которое равно значению перечисления OTHER_LETTER :

assertEquals(Character.OTHER_LETTER, Character.getType('\u05d0'));

Символ Unicode ' = 0 ' представляет еврейскую букву Алеф.

2.6. LETTER_NUMBER

Наконец, категория LETTER_NUMBER связана с цифрами, состоящими из букв или буквоподобных символов.

Например, римские цифры относятся к общей категории LETTER_NUMBER . Когда мы вызываем метод getType символа # с римской цифрой пять, 'Ⅴ', он возвращает значение 10, равное значению перечисления LETTER_NUMBER :

assertEquals(Character.LETTER_NUMBER, Character.getType('\u2164'));

Символ Unicode ' \u2164 ' представляет собой римскую цифру пять.

Далее рассмотрим метод Character # isAlphabetic .

3. Номер символа в алфавитном порядке

Во-первых, давайте посмотрим на сигнатуру метода isAlphabetic :

public static boolean isAlphabetic(int codePoint)

Это принимает кодовую точку Unicode в качестве входного параметра и возвращает true , если указанная кодовая точка Unicode является буквенной, и false в противном случае .

Символ является буквенным, если его общий тип категории является одним из следующих:

  • ПРОПИСНАЯ БУКВА
  • СТРОЧНАЯ БУКВА
  • TITLECASE_LETTER
  • MODIFIER_LETTER
  • OTHER_LETTER
  • LETTER_NUMBER

Кроме того, символ является алфавитным, если он имеет дополнительное свойство Other_Alphabetic `` , как определено в стандарте Unicode.

Давайте рассмотрим несколько примеров символов, которые являются алфавитами:

assertTrue(Character.isAlphabetic('A'));
assertTrue(Character.isAlphabetic('\u01f2'));

В приведенных выше примерах мы передаем UPPERCASE_LETTER 'A' и TITLECASE_LETTER '\u01f2', которые представляют латинскую заглавную букву ' D ', за которой следует маленькая ' Z ' с кароном, в метод isAlphabetic , и он возвращает true.

4. Символ # isLetter

Класс символов Java предоставляет метод isLetter() для определения, является ли указанный символ буквой. Посмотрим на сигнатуру метода:

public static boolean isLetter(char ch)

Он принимает символ в качестве входного параметра и возвращает true , если указанный символ является буквой, и false в противном случае .

Символ считается буквой, если его общий тип категории, предоставленный методом Character # getType , является одним из следующих:

  • ПРОПИСНАЯ БУКВА
  • СТРОЧНАЯ БУКВА
  • TITLECASE_LETTER
  • MODIFIER_LETTER
  • OTHER_LETTER

Однако этот метод не может обрабатывать дополнительные символы. Для обработки всех символов Юникода, включая дополнительные символы, класс символов Java предоставляет перегруженную версию метода isLetter() :

public static boolean isLetter(int codePoint)

Этот метод может обрабатывать все символы Unicode, поскольку он принимает кодовую точку Unicode в качестве входного параметра. Кроме того, он возвращает true , если указанная кодовая точка Unicode является буквой, как мы определили ранее.

Давайте рассмотрим несколько примеров символов, которые являются буквами:

assertTrue(Character.isAlphabetic('a'));
assertTrue(Character.isAlphabetic('\u02b0'));

В приведенных выше примерах мы вводим LOWERCASE_LETTER 'a' и MODIFIER_LETTER '\ u02b0', которые представляют маленькую букву модификатора H , в метод isLetter , и он возвращает true.

5. Сравните и сопоставьте

Наконец, мы можем видеть, что все буквы являются буквами, но не все буквы являются буквами .

Другими словами, метод isAlphabetic возвращает значение true , если символ является буквой или имеет общую категорию LETTER_NUMBER . Кроме того, он также возвращает true , если у символа есть свойство Other_Alphabetic , определенное стандартом Unicode.

Во-первых, давайте рассмотрим пример символа, который является как буквой, так и алфавитом — символом « a »:

assertTrue(Character.isLetter('a')); 
assertTrue(Character.isAlphabetic('a'));

Символ ' a ', переданный в качестве входного параметра как методу isLetter() , так и методу isAlphabetic() , возвращает значение true .

Далее, давайте рассмотрим пример символа, который является алфавитом, но не буквой. В этом случае мы будем использовать символ Unicode ' \u2164 ', который представляет римскую цифру пять:

assertFalse(Character.isLetter('\u2164'));
assertTrue(Character.isAlphabetic('\u2164'));

Символ Unicode ' \u2164 ' при передаче в метод isLetter() возвращает false. С другой стороны, при передаче в метод isAlphabetic() он возвращает true .

Конечно, для английского языка это различие не имеет значения. Поскольку все буквы английского языка относятся к категории алфавитов. С другой стороны, некоторые символы в других языках могут иметь отличия.

6. Заключение

В этой статье мы узнали о различных общих категориях кодовой точки Unicode. Кроме того, мы рассмотрели сходства и различия между методами isAlphabetic() и isLetter() .

Как всегда, все эти примеры кода доступны на GitHub .