Способы чтения ввода с консоли в Java
В Java существует четыре различных способа чтения ввода от пользователя в среде командной строки (из консоли).
Рассмотрим один из них - использование класса Buffered Reader. Это классический метод ввода данных в Java, представленный в JDK 1.0. Этот метод используется путем обертывания System .in (стандартный поток ввода) в InputStreamReader, который обернут в BufferedReader.
#java
Подписывайтесь на канал 👉@cod_academy
В Java существует четыре различных способа чтения ввода от пользователя в среде командной строки (из консоли).
Рассмотрим один из них - использование класса Buffered Reader. Это классический метод ввода данных в Java, представленный в JDK 1.0. Этот метод используется путем обертывания System .in (стандартный поток ввода) в InputStreamReader, который обернут в BufferedReader.
#java
Подписывайтесь на канал 👉@cod_academy
👍5
Избегайте неоправданных циклов с коллекциями
Предположим, что требуется создать новый список, элементами которого будут являться квадраты чисел данного списка. Большинство сразу же напишут простенький цикл for.
Но в этом и проблема. Такой подход займет как минимум три строчки: объявление новой переменной, создание цикла и инструкции внутри него. При этом также снижается скорость работы скрипта.
На прикрепленной картинке я привел две достойные альтернативы, а именно использование генератора списков и функции map. В обоих вариантах не только код становится короче и выразительнее, но и заметно повышается производительность.
#python
Подписывайтесь на канал 👉@cod_academy
Предположим, что требуется создать новый список, элементами которого будут являться квадраты чисел данного списка. Большинство сразу же напишут простенький цикл for.
Но в этом и проблема. Такой подход займет как минимум три строчки: объявление новой переменной, создание цикла и инструкции внутри него. При этом также снижается скорость работы скрипта.
На прикрепленной картинке я привел две достойные альтернативы, а именно использование генератора списков и функции map. В обоих вариантах не только код становится короче и выразительнее, но и заметно повышается производительность.
#python
Подписывайтесь на канал 👉@cod_academy
👍2
В чем отличие malloc от new?
Ответ: malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void * и требует обязательного приведения. new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее.
#cpp
Подписывайтесь на канал 👉@cod_academy
Ответ: malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void * и требует обязательного приведения. new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍2
Меняем местами две переменные в одной строке
Многие знают, что в Python можно красиво поменять значения переменных в одну строку: a, b = b, a
Можно ли что-то похожее сделать в Java? Да. На картинке показан пример, но в реальных проектах так делать не стоит.
#java
Подписывайтесь на канал 👉@cod_academy
Многие знают, что в Python можно красиво поменять значения переменных в одну строку: a, b = b, a
Можно ли что-то похожее сделать в Java? Да. На картинке показан пример, но в реальных проектах так делать не стоит.
#java
Подписывайтесь на канал 👉@cod_academy
👍1
"Быстрый" контейнер deque
Встроенных списков в Python иногда может не хватать, поэтому покажем одну хорошую альтернативу. Deque может быть реализован c помощью модуля collections.
Deque предпочтительнее, чем обычный список, в тех случаях, когда нам нужны более быстрые операции добавления и вытягивания элементо из обоих концов контейнера, поскольку deque обеспечивает линейную сложность O(1) для операций добавления и выталкивания по сравнению со списком, у которого сложность по времени для тех операций составляет O(n).
Также для deque есть возможность использовать стандартные функции по типу sum, min, max и тому подобные.
#python
Подписывайтесь на канал 👉@cod_academy
Встроенных списков в Python иногда может не хватать, поэтому покажем одну хорошую альтернативу. Deque может быть реализован c помощью модуля collections.
Deque предпочтительнее, чем обычный список, в тех случаях, когда нам нужны более быстрые операции добавления и вытягивания элементо из обоих концов контейнера, поскольку deque обеспечивает линейную сложность O(1) для операций добавления и выталкивания по сравнению со списком, у которого сложность по времени для тех операций составляет O(n).
Также для deque есть возможность использовать стандартные функции по типу sum, min, max и тому подобные.
#python
Подписывайтесь на канал 👉@cod_academy
👍1
Бесконечный цикл
Для чего? Когда while(true), while(1), for(;;) и прочие стандартные пути создания цикла кажутся не слишком информативными, можно использовать подобный макрос. Единственный плюс который он дает — чуть лучшую читаемость кода.
#cpp
Подписывайтесь на канал 👉@cod_academy
Для чего? Когда while(true), while(1), for(;;) и прочие стандартные пути создания цикла кажутся не слишком информативными, можно использовать подобный макрос. Единственный плюс который он дает — чуть лучшую читаемость кода.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍1
Класс Java.io.OutputStream в Java
Этот абстрактный класс является суперклассом всех классов, представляющих выходной поток байтов. Output-поток принимает байты и отправляет их в какой-то приемник. Приложения, которым необходимо определить подкласс OutputStream, всегда должны предоставлять по крайней мере метод, который записывает один байт вывода.
#java
Подписывайтесь на канал 👉@cod_academy
Этот абстрактный класс является суперклассом всех классов, представляющих выходной поток байтов. Output-поток принимает байты и отправляет их в какой-то приемник. Приложения, которым необходимо определить подкласс OutputStream, всегда должны предоставлять по крайней мере метод, который записывает один байт вывода.
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Как проверить существование переменной в Python?
Вы можете использовать in locals() или in globals(), чтобы проверить переменная существует в Python, разница только:
in locals() проверяет если переменная объявлена в локальной зоне видимости
in globals() проверяет если переменная объявлена в глобальной зоне видимости
#python
Подписывайтесь на канал 👉@cod_academy
Вы можете использовать in locals() или in globals(), чтобы проверить переменная существует в Python, разница только:
in locals() проверяет если переменная объявлена в локальной зоне видимости
in globals() проверяет если переменная объявлена в глобальной зоне видимости
#python
Подписывайтесь на канал 👉@cod_academy
👍2
Какие классы и интерфейсы доступны в Collection фреймворке?
Интерфейсы:
• Collection;
• List;
• Set;
• Map;
• Sorted Set;
• Sorted Map;
• Queue.
Классы:
• Lists(ArrayList, LinkedList, Vector(deprecated))
• Sets(HashSet, LinkedHashSet, TreeSet)
• Maps(HashMap, TreeMap, HashTable (deprecated), LinkedHashMap)
• Queue(Priority Queue)
#java
Подписывайтесь на канал 👉@cod_academy
Интерфейсы:
• Collection;
• List;
• Set;
• Map;
• Sorted Set;
• Sorted Map;
• Queue.
Классы:
• Lists(ArrayList, LinkedList, Vector(deprecated))
• Sets(HashSet, LinkedHashSet, TreeSet)
• Maps(HashMap, TreeMap, HashTable (deprecated), LinkedHashMap)
• Queue(Priority Queue)
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Switch
Switch позволяет проверять различные условия выражения. Если же есть совпадение, будет выполняться определенная команда.
Break используется для выхода из case. Если же не использовать break, будут выполняться все условия подряд. Код в default выполняется при условии, если ни один case не был выполнен.
#cpp
Подписывайтесь на канал 👉@cod_academy
Switch позволяет проверять различные условия выражения. Если же есть совпадение, будет выполняться определенная команда.
Break используется для выхода из case. Если же не использовать break, будут выполняться все условия подряд. Код в default выполняется при условии, если ни один case не был выполнен.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍1
Метод endsWith()
Проверяет заканчивается ли эта строка указанным окончанием.
Метод возвращает значение true, если последовательность символов, представленного аргумента является окончанием последовательности символов, представленного этим объектом; в противном случаи значение false. Обратите внимание, что результатом будет значение true, если аргумент является пустой строкой или равным строковому объекту, определено как методом equals(Object).
#java
Подписывайтесь на канал 👉@cod_academy
Проверяет заканчивается ли эта строка указанным окончанием.
Метод возвращает значение true, если последовательность символов, представленного аргумента является окончанием последовательности символов, представленного этим объектом; в противном случаи значение false. Обратите внимание, что результатом будет значение true, если аргумент является пустой строкой или равным строковому объекту, определено как методом equals(Object).
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Официальное упорядочивание словарей
Кстати, Python 3.7 на официальном уровне зафиксировал соответствие порядка перебора элементов словарей порядку их добавления.
Но для некоторых это не такая уж и новость, так как и в Python 3.6 словари уже были упорядочены, что видно на примере выше.
Однако это был просто побочный результат реализации, не зафиксированный в стандарте. Новый Python оформил его официально. Теперь можно быть уверенным в сохранении порядка вставки.
#python
Подписывайтесь на канал 👉@cod_academy
Кстати, Python 3.7 на официальном уровне зафиксировал соответствие порядка перебора элементов словарей порядку их добавления.
Но для некоторых это не такая уж и новость, так как и в Python 3.6 словари уже были упорядочены, что видно на примере выше.
Однако это был просто побочный результат реализации, не зафиксированный в стандарте. Новый Python оформил его официально. Теперь можно быть уверенным в сохранении порядка вставки.
#python
Подписывайтесь на канал 👉@cod_academy
👍1
Представления (Views)
Представления — это просто-напросто диапазоны, которые дешево копировать и перемещать (за константное время). Из-за этого представление не может владеть элементами, которые просматривает. Одно исключение — std::views::single, которому принадлежит единственный просматриваемый элемент.
Представления компонуются во время компиляции с прицелом на то, что компилятор заинлайнит код.
Например, следующий код последние последние три элемента диапазона. Сначала мы reverse’им диапазон, затем берем первые три элемента и, наконец, снова reverse’им диапазон (обратите внимание, что существует std::views::drop, который делает это напрямую).
#cpp
Подписывайтесь на канал 👉@cod_academy
Представления — это просто-напросто диапазоны, которые дешево копировать и перемещать (за константное время). Из-за этого представление не может владеть элементами, которые просматривает. Одно исключение — std::views::single, которому принадлежит единственный просматриваемый элемент.
Представления компонуются во время компиляции с прицелом на то, что компилятор заинлайнит код.
Например, следующий код последние последние три элемента диапазона. Сначала мы reverse’им диапазон, затем берем первые три элемента и, наконец, снова reverse’им диапазон (обратите внимание, что существует std::views::drop, который делает это напрямую).
#cpp
Подписывайтесь на канал 👉@cod_academy
Оператор присваивания ( = ), строго говоря, является бинарным оператором. Его объявление идентично объявлению любого другого бинарного оператора со следующими исключениями:
☑️ Он должен быть нестатической функцией-членом.
☑️ Он не наследуется производными классами.
☑️ Компилятор может создать функцию operator = по умолчанию для типов классов, если она не существует.
В примере показано, как объявить оператор присваивания.
#cpp
Подписывайтесь на канал 👉@cod_academy
☑️ Он должен быть нестатической функцией-членом.
☑️ Он не наследуется производными классами.
☑️ Компилятор может создать функцию operator = по умолчанию для типов классов, если она не существует.
В примере показано, как объявить оператор присваивания.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍2
Бинарный поиск
Чаще всего бинарный поиск (бинпоиск) используют, чтобы найти элемент в отсортированном массиве. Мы начинаем искать с середины массива. Если находим то, что нужно, или если больше нечего рассматривать, мы останавливаемся. В противном случае мы решаем, в каком направлении — вправо или влево от середины — мы должны продолжить поиск. Так как пространство поиска после каждой проверки делится на два, то время выполнения алгоритма — O(log n).
#cpp
Подписывайтесь на канал 👉@cod_academy
Чаще всего бинарный поиск (бинпоиск) используют, чтобы найти элемент в отсортированном массиве. Мы начинаем искать с середины массива. Если находим то, что нужно, или если больше нечего рассматривать, мы останавливаемся. В противном случае мы решаем, в каком направлении — вправо или влево от середины — мы должны продолжить поиск. Так как пространство поиска после каждой проверки делится на два, то время выполнения алгоритма — O(log n).
#cpp
Подписывайтесь на канал 👉@cod_academy
👍2
Контекстные менеджеры
Контекстные менеджеры позволяют задать поведение при работе с конструкцией with: при входе и выходе из блока. Это упрощает работу с ресурсами в части их захвата и освобождения; транзакциями, когда нужно либо полностью закончить транзакцию, либо откатить ее целиком.
Простейшей функцией, использующей данный принцип является функция open. Каждый раз, когда мы открываем файл, нам необходимо его закрыть, чтобы вытолкнуть выходные данные на диск (на самом деле Python вызывает метод close автоматически, но явное его использование является хорошим тоном).
Чтобы каждый раз не вызывать метод close мы можем воспользоваться контекстным менеджером функции open, который автоматически закроет файл после выхода из блока.
#python
Подписывайтесь на канал 👉@cod_academy
Контекстные менеджеры позволяют задать поведение при работе с конструкцией with: при входе и выходе из блока. Это упрощает работу с ресурсами в части их захвата и освобождения; транзакциями, когда нужно либо полностью закончить транзакцию, либо откатить ее целиком.
Простейшей функцией, использующей данный принцип является функция open. Каждый раз, когда мы открываем файл, нам необходимо его закрыть, чтобы вытолкнуть выходные данные на диск (на самом деле Python вызывает метод close автоматически, но явное его использование является хорошим тоном).
Чтобы каждый раз не вызывать метод close мы можем воспользоваться контекстным менеджером функции open, который автоматически закроет файл после выхода из блока.
#python
Подписывайтесь на канал 👉@cod_academy
👍1
forward_list::unique() в C++ STL
forward_list::unique() — это встроенная функция в C++ STL, которая удаляет все последовательные повторяющиеся элементы из forward_list. Для сравнения используется бинарный предикат.
#cpp
Подписывайтесь на канал 👉@cod_academy
forward_list::unique() — это встроенная функция в C++ STL, которая удаляет все последовательные повторяющиеся элементы из forward_list. Для сравнения используется бинарный предикат.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍1
Как получить доступ к переопределенным методам родительского класса?
С помощью ключевого слова super мы можем обратиться к любому члену родительского класса - методу или полю, если они не определены с модификатором private.
#java
Подписывайтесь на канал 👉@cod_academy
С помощью ключевого слова super мы можем обратиться к любому члену родительского класса - методу или полю, если они не определены с модификатором private.
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Алгоритм lexicographic_compare
Совершает лексикографическое сравнение 2 диапазонов
Лексикографическое сравнение - это операция со следующими свойствами:
1)Два диапазона сравниваются поэлементно.
2)Первый элемент несовпадения определяет, какой диапазон лексикографически меньше или больше другого.
3)Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
4)Если два диапазона имеют эквивалентные элементы и имеют одинаковую длину, тогда диапазоны лексикографически равны.
5)Пустой диапазон лексикографически меньше любого непустого диапазона.
6)Два пустых диапазона лексикографически равны.
#cpp
Подписывайтесь на канал 👉@cod_academy
Совершает лексикографическое сравнение 2 диапазонов
Лексикографическое сравнение - это операция со следующими свойствами:
1)Два диапазона сравниваются поэлементно.
2)Первый элемент несовпадения определяет, какой диапазон лексикографически меньше или больше другого.
3)Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
4)Если два диапазона имеют эквивалентные элементы и имеют одинаковую длину, тогда диапазоны лексикографически равны.
5)Пустой диапазон лексикографически меньше любого непустого диапазона.
6)Два пустых диапазона лексикографически равны.
#cpp
Подписывайтесь на канал 👉@cod_academy
👍1
Ключевое слово instanceof в Java и его применения
instanceof — это ключевое слово, которое используется для проверки того, содержит ли ссылочная переменная объектную ссылку данного типа или нет. Чтобы лучше понять его суть, предлагаю обратиться к примеру кода.
#java
Подписывайтесь на канал 👉@cod_academy
instanceof — это ключевое слово, которое используется для проверки того, содержит ли ссылочная переменная объектную ссылку данного типа или нет. Чтобы лучше понять его суть, предлагаю обратиться к примеру кода.
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Копирование словарей и других объектов
Новички часто допускают такую ошибку при создании копии списка:
lst2 = lst1
При работе с одним из словарей оказывается, что изменяются оба.
Почему так происходит?
Об этом — в завтрашнем посте. Пока что расскажу, как этого избежать:
У списка существует специальный метод copy(), который нужен как раз для таких случаев.
Но подобное работает не всегда! Если имеется множество вложенных списков, то надо сделать полное копирование импортировав модуль copy и воспользовавшись методом deepcopy().
#python
Подписывайтесь на канал 👉@cod_academy
Новички часто допускают такую ошибку при создании копии списка:
lst2 = lst1
При работе с одним из словарей оказывается, что изменяются оба.
Почему так происходит?
Об этом — в завтрашнем посте. Пока что расскажу, как этого избежать:
У списка существует специальный метод copy(), который нужен как раз для таких случаев.
Но подобное работает не всегда! Если имеется множество вложенных списков, то надо сделать полное копирование импортировав модуль copy и воспользовавшись методом deepcopy().
#python
Подписывайтесь на канал 👉@cod_academy
👍1