Вечер фейспалмов продолжается

А вот мне рассказали, чему учат юных джавистов в TU D-stadt. Задание простое — проверить, является ли текстовая строка палиндромом (без учета пробелов) — скажем, таковыми будут «шалаш» или «оголи жопу пожилого» (привет Пенсионному фонду). Ну как это делает нормальный человек? Заводим указатели на начало и конец строки, двигаем их навстречу друг другу, пропуская пробелы, и сравниваем буквы.

palindrom

Так вот, сейчас студентов учат немного другому. Надо сначала выполнить метод trim(), отрезав от строки пробелы в начале и в конце, потом сравнить первую букву с последней, затем выполнить метод substring() и повторить это с обрезанной строкой. Прикольно, да? Не знаю, как у вас, а я не могу обойтись без слов «пиздец», «охуеть» и «ебланы», когда рассказываю об этом.

Вечер фейспалмов продолжается: 16 комментариев

          1. сдается мне, вам просто в голову не пришло про многобайтные кодировки.
            trim/substr будут давать одинаковый результат в любой кодировке, а ваш самописный «немного сложнее» придется переписывать под каждую отдельно.

            Кстати, а в яве есть указатели типа char* ?
            Это не чисто-ли сишная возможность выстрелить себе в ногу?

            1. С многобайтными кодировками сильно сложнее не будет — разве что указатель придется двигать на несколько байт иногда. С передним в UTF-8 все понятно, а задний просто двигаем синхронно с передним.

              В Java вместо указателей используем индексы в массиве, ну или charAt().

              1. Не иногда, а практически всегда. Причем двигать ниразу не синхронно, потому что сначала надо задний сдвинуть до начала символа, а потом уже вместе с передним двигать вперед со сравнением. При этом не забыв пропускать все, что is_space. Надеюсь, это вы не предлагаете прямым сравнением делать?

                И что, кстати, вернет charat — байт или символ?

                    1. A String represents a string in the UTF-16 format in which supplementary characters are represented by surrogate pairs (see the section Unicode Character Representations in the Character class for more information). Index values refer to char code units, so a supplementary character uses two positions in a String.

                    2. …based on the original Unicode specification, which defined characters as fixed-width 16-bit entities?

                    3. Блин, ну я прямо не знаю, можно было посмотреть за это время, как расово правильный trim и substring работают в любом из OpenJDK, и убедиться, что там нет вообще ничего из тех страшилок, на которые ты намекаешь.

                      https://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/lang/String.java

      1. По поводу «оптимальности» приведенного алгоритма вы конечно же правы. Просто срачик в коментах идет в понятиях C/C++ — указатели, типы данных. Вообще-то начинать изучение программирования с Java — вкорне неправильно. Потом очень трудно понять что такое указатель, когда объект копируется, а когда передается по ссылке, зачем освобождать память и т.д. В другую сторону тоже есть трудности, например, непонятно какого хрена оператор = не создает копию объекта.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *