Найти в Дзене
Иван

Решаем задачи по Java. Задача №3. Палиндром.

Оглавление

Всем привет!

Два дня решал задачу по Spring-у. Через боль, пот и кровь, но всё-таки добил её. Очень интересный framework, но после кора, совсем непонятный).

И чтобы разбавить это дело, поговорим сегодня об одной, очень интересной задачке. А именно, о проверке, является ли текст палиндромом? Далеко ходить не будем, условие:

Реализуйте метод, проверяющий, является ли переданная строка палиндромом. При определении "палиндромности", должны учитываться только цифры и буквы. Всё остальное (пробелы, регистр, знаки препинания и т.п.) должно игнорироваться. Гарантируется, что будет использоваться только латинские буквы, цифры и знаки препинания.
-2

У этой задачи есть отличное, красивое решение через stream. Но о них мы еще не говорили, поэтому попытаемся её решить используя несколько стандартных методов и классов. А именно:

1. StringBuilder

2. replaceAll

3. reverse()

4. equalsIgnoreCase

Но для начала, давайте уясним для себя, что такое палиндром. Для любителей официальных формулировок вот ссылка на википедию. Для тех кто уже посмотрел фильм Довод, будет более-менее понятно. Там весь фильм это сплошной палиндром. Короче говоря палиндром, это слово/текст, которые читается одинаково и слева направо и наоборот. Например: довод. :)

-3

Перед тем как начать выполнять задачу, давайте подумаем в голове, что мы должны сделать. Метод возвращает булевское значение, получается, нам нужно что-то сравнить.

На вход нам идет одна лишь строка. Что с чем сравнивать то?

Правильно, строку с этой же строкой, только перевернутой. То есть мы должны принять строку, избавиться от лишних символов и пробелов, перевернуть её и вернуть результат сравнения измененной строки с изначальной.

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

Подсказка: есть специальное регулярное выражение, которое "вырезает" всё кроме цифр и букв: "[^a-zA-Z0-9]".

Ок, с первым заданием справились. Теперь мы имеем строку с набором символов и чисел.

Теперь про "перевернуть". Тут конечно же нам нужен метод reverse(). Читаем. Стоит отметить, что данный метода работает только на объектах StringBuffer и StringBuilder. Читаем собственно и о них тоже. Вот.

Получается, чтобы провернуть все вышеуказанные операции, нам необходимо создать новый объект StringBuilder, в качестве параметров засунуть в него нашу строку. Причем вырезать лишнее можно там же, в параметрах. Далее на этом объекте мы применяем reverse() - переворачиваем строку, и засовываем всё это в переменную String.

Всё бы было хорошо, но мы не можем засунуть StringBuilder в String. Это разные классы. Поэтому в конце мы должны применить метод toString. И будет нам счастье.

На выходе мы имеем переменную типа String, в которой наш измененный как нам надо и перевернутый в обратную сторону текст. Осталось самую малость: сравнить его с изначальным, но обрезанным, текстом. Думаю тут проблем не будет.

Берем нашу переданную в параметры строку, вырезаем известным нам способом всё лишнее, сравниваем с переменной в которой лежит "обратный" текст. Возвращаем всё это.

Единственное, что мы забыли, что нам необходимо игнорировать регистр. Тут можно было конечно все строки привести к единому регистру, но зачем, когда есть отличный метод equalsIgnoreCase. Читаем.

Ну вот и всё. Очередная задача покорена :)

-4

Вот текст вам для теста, результат должен быть true:

Was it a cat I saw?

В следующей статье немного углубимся в математику, будем вычислять факториал числа!

Удачи!