├── 01_compile.txt ├── 02_about_JAR.txt ├── 03_hello_world.java ├── 04_javadoc_comments.txt ├── 05_run_scripts.java ├── 06_sokobat.txt ├── Basic_junior ├── Readme.txt └── Практика.txt ├── Java-stepic-basic ├── 2_2_3.java ├── 2_2_8.java ├── 2_2_9.java └── readme.txt ├── JavaRush ├── 0.java ├── 1.java ├── 1.txt ├── 2.txt ├── Method_in_Java.txt ├── Simple_type_in_Java.txt └── readme.txt ├── Java_MailRu_1 └── 2.3.3.java ├── README.md ├── analys_text.java ├── encode.java ├── mailService.java ├── mail_service.java ├── min_max.java ├── split_string.java └── ternary_operator.java /01_compile.txt: -------------------------------------------------------------------------------- 1 | Выберите правильные объявления метода main — такие, 2 | при которых программа успешно скомпилируется и запустится. 3 | 4 | static void main(String[] args) 5 | public static void main(String[] args) <-this 6 | public static void main() 7 | public void main(String[] args) 8 | public static int main(String[] args) 9 | -------------------------------------------------------------------------------- /02_about_JAR.txt: -------------------------------------------------------------------------------- 1 | Выберите верные утверждения про формат JAR. Может быть выбрано несколько пунктов. 2 | 3 | 4 | Формат JAR основан на формате ZIP. <-this 5 | В JAR-архиве должен быть специальный файл с метаданными — META-INF/MANIFEST.MF. <-this 6 | Формат JAR основан на формате RAR. 7 | В JAR-файл разрешено запаковывать только class-файлы. 8 | -------------------------------------------------------------------------------- /03_hello_world.java: -------------------------------------------------------------------------------- 1 | Напишите программу, выводящую в консоль Hello world! 2 | Класс должен называться "Main", это ограничение проверяющей системы. 3 | 4 | Sample Input: 5 | 6 | Sample Output: 7 | 8 | Hello world! 9 | 10 | public class Main{ 11 | public static void main(String[] args){ 12 | System.out.println("Hello world"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /04_javadoc_comments.txt: -------------------------------------------------------------------------------- 1 | Выберите из приведенных ниже комментариев те, которые являются JavaDoc-комментариями. 2 | 3 | /** Is this a javadoc? */ <-this 4 | /* Is this a javadoc? */ 5 | /// Is this a javadoc? 6 | /*! Is this a javadoc? */ 7 | -------------------------------------------------------------------------------- /05_run_scripts.java: -------------------------------------------------------------------------------- 1 | Чтобы убедиться, что вы действительно научились пользоваться компилятором и запускать Java-программы, запустите следующую программу. 2 | В качестве ответа введите то, что эта программа напечатает в консоль. 3 | 4 | import java.security.MessageDigest; 5 | 6 | public class Quiz { 7 | 8 | public static void main(String[] args) throws Exception { 9 | MessageDigest md = MessageDigest.getInstance("MD5"); 10 | byte[] digest = md.digest("abracadabra".getBytes("UTF-8")); 11 | for (byte b : digest) { 12 | System.out.printf("%02x", b); 13 | } 14 | } 15 | } 16 | 17 | ec5287c45f0e70ec22d52e8bcbeeb640 18 | -------------------------------------------------------------------------------- /06_sokobat.txt: -------------------------------------------------------------------------------- 1 | Скачайте игру Sokobano, написанную на Java. Ваша задача — определить имя главного класса игры. 2 | Того, который содержит метод main и все запускает. Введите имя этого класса ниже. 3 | 4 | Application 5 | -------------------------------------------------------------------------------- /Basic_junior/Readme.txt: -------------------------------------------------------------------------------- 1 | Мотивация 2 | 3 | * Сформулировать цель 4 | * Прежде чем что-либо делать - зачем ? 5 | * Что вы готовы отдавать, чтобы получить желаемое ? 6 | -------------------------------------------------------------------------------- /Basic_junior/Практика.txt: -------------------------------------------------------------------------------- 1 | Какие практики есть хорошие ? 2 | 3 | Eat first frog in the morning 4 | Планирование дел вечером 5 | Работать в команде 6 | * Менять установки учебной системы 7 | * Учиться "списывать" 8 | * Учиться делиться 9 | "Повторение - мать учения". Время от времени возвращаться к основам. 10 | В транспорте случать-читать полезный контент. 11 | Делиться знаниями 12 | -------------------------------------------------------------------------------- /Java-stepic-basic/2_2_3.java: -------------------------------------------------------------------------------- 1 | Реализуйте метод, который возвращает букву, стоящую в таблице UNICODE после символа "\" (обратный слэш) на расстоянии a: 2 | 3 | В качестве примера написано заведомо неправильное выражение. Исправьте его. 4 | 5 | Sample Input 1: 6 | 7 | 15 8 | 9 | Sample Output 1: 10 | 11 | k 12 | 13 | 14 | Sample Input 2: 15 | 16 | 8 17 | 18 | Sample Output 2: 19 | 20 | d 21 | 22 | 23 | https://docs.oracle.com/javase/tutorial/java/data/characters.html 24 | 25 | public char charExpression(int a) { 26 | int s = '\\'; 27 | int total = s + a; 28 | char unicode = (char) total; 29 | return unicode; 30 | } 31 | -------------------------------------------------------------------------------- /Java-stepic-basic/2_2_8.java: -------------------------------------------------------------------------------- 1 | Укажите преобразования типов, которые компилятор делает автоматически. 2 | Другими словами, для каких преобразований не требуется явно писать в программе оператор приведения типа? 3 | 4 | 5 | int -> long 6 | long -> float 7 | byte -> char 8 | char -> Character 9 | String -> int 10 | int -> boolean 11 | char -> int 12 | float -> long 13 | 14 | 15 | import java.math.*; 16 | public class Main { 17 | public static void main(String[] args) { 18 | float a = 1222222222222L; // long -> float 19 | int b = 'b'; // char -> int 20 | Character c = 'b'; // char -> Character 21 | long d = 3213; // int -> long 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Java-stepic-basic/2_2_9.java: -------------------------------------------------------------------------------- 1 | Реализуйте метод, проверяющий, является ли заданное число по абсолютной величине степенью двойки. 2 | 3 | Если для решения задачи вам требуются циклы или условные операторы, то можете вернуться 4 | к ней после просмотра соответствующих уроков. Хотя решить можно и без них. 5 | 6 | Воспользуйтесь предоставленным шаблоном. Декларацию класса, метод main и обработку ввода-вывода добавит проверяющая система. 7 | 8 | Sample Input 1: 9 | 10 | 0 11 | 12 | Sample Output 1: 13 | 14 | false 15 | 16 | 17 | Sample Input 2: 18 | 19 | 1 20 | 21 | Sample Output 2: 22 | 23 | true 24 | 25 | 26 | Sample Input 3: 27 | 28 | -2 29 | 30 | Sample Output 3: 31 | 32 | true 33 | 34 | 35 | /** 36 | * Checks if given value is a power of two. 37 | * 38 | * @param value any number 39 | * @return true when value is power of two, false otherwise 40 | */ 41 | public static boolean isPowerOfTwo(int value) { 42 | if (value == 0) { 43 | return false; 44 | } 45 | else { 46 | int res = Math.abs(value); 47 | return (res & (res - 1)) == 0; 48 | } 49 | // you implementation here 50 | } 51 | 52 | Побитовые операции и операции битового сдвига в Java и не только 53 | 54 | http://www.pvsm.ru/java/39711 55 | -------------------------------------------------------------------------------- /Java-stepic-basic/readme.txt: -------------------------------------------------------------------------------- 1 | О КУРСЕ 2 | 3 | Этот вводный курс познакомит слушателей с базовыми возможностями языка программирования Java. 4 | Курс входит в годовую онлайн-программу по основам программирования. 5 | 6 | http://code.stepic.org/ 7 | -------------------------------------------------------------------------------- /JavaRush/0.java: -------------------------------------------------------------------------------- 1 | package com.javarush.test.level00.lesson02.task01; 2 | 3 | /* Быть программистом - круто! 4 | Напиши программу, которая выводит на экран надпись: «Я думаю, быть программистом - это круто». 5 | Пример вывода на экран: 6 | Я думаю, быть программистом - это круто 7 | */ 8 | Код 9 | 10 | public class Solution 11 | { 12 | public static void main(String[] args) 13 | { 14 | System.out.print("Я думаю, быть программистом - это круто"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /JavaRush/1.java: -------------------------------------------------------------------------------- 1 | Создайте объект типа Cat(кот), объект типа Dog (собака), объект типа Fish (рыбка) и объект типа Woman. 2 | Присвойте каждому животному владельца (owner). 3 | 4 | 5 | package com.javarush.test.level02.lesson05.task03; 6 | 7 | /* У каждого животного должна быть хозяйка. 8 | Создайте объект типа Cat(кот), объект типа Dog (собака), объект типа Fish (рыбка) и объект типа Woman. 9 | Присвойте каждому животному владельца (owner). 10 | */ 11 | public class Solution 12 | { 13 | public static void main(String[] args) 14 | { 15 | //напишите тут ваш код 16 | Cat cat = new Cat(); 17 | Dog dog = new Dog(); 18 | Fish fish = new Fish(); 19 | Woman woman = new Woman(); 20 | 21 | dog.owner=woman; 22 | fish.owner=woman; 23 | cat.owner=woman; 24 | 25 | } 26 | 27 | public static class Cat 28 | { 29 | public Woman owner; 30 | } 31 | 32 | public static class Dog 33 | { 34 | public Woman owner; 35 | } 36 | 37 | public static class Fish 38 | { 39 | public Woman owner; 40 | } 41 | 42 | public static class Woman 43 | { 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /JavaRush/1.txt: -------------------------------------------------------------------------------- 1 | Каждая переменная в Java имеет три важных свойства: тип, имя и значение. 2 | 3 | - Имя используется для того, чтобы отличать одну переменную от другой. Это как надпись на коробке. 4 | 5 | - Тип переменной определяет тип значений/данных, которые в ней можно хранить. 6 | В коробке для торта храним торт, в коробке для обуви – туфли, и т.д. 7 | 8 | - Значение – это некий объект, данные или информация, которая хранится в переменной. 9 | 10 | int a; Создаем переменную по имени a типа int. 11 | 2 String s; Создаем переменную по имени s типа String. 12 | 3 double c; Создаем переменную по имени c типа double. 13 | -------------------------------------------------------------------------------- /JavaRush/2.txt: -------------------------------------------------------------------------------- 1 | Сегодня ты узнал: 2 | 3 | Что такое переменные 4 | Как выводить сообщения на экран 5 | Познакомился с типами int и String 6 | Чем компиляция в Java отличается от других языков 7 | Как делать комментарии и зачем они нужны 8 | -------------------------------------------------------------------------------- /JavaRush/Method_in_Java.txt: -------------------------------------------------------------------------------- 1 | Методы в Java 2 | 3 | http://info.javarush.ru/javarush_articles/2015/12/01/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B2-Java.html 4 | 5 | Для определения методов используется следующий формат: 6 | 7 | возвращаемый-тип идентификатор-метода (параметры) 8 | { 9 | тело-метода 10 | } 11 | 12 | 13 | Возвращаемый-тип определяет тип данных, которые возвращает метод при вызове (возвращаемый ответ на сообщение). Если метод не возвращает никакого значения, то возвращаемый-тип имеет значение void. Идентификатор-метода определяет имя метода, а параметры – список параметров, которые необходимо передать методу при его вызове. Параметры в списке отделяются друг от друга запятыми и каждый параметр имеет следующий вид: 14 | 15 | тип идентификатор 16 | 17 | 18 | где тип определяет тип параметра, а идентификатор – имя параметра (область действия этого имени – только внутри тела метода). Если параметры отсутствуют, после идентификатора-метода указываются пустые скобки. 19 | Тело-метода содержит операторы, реализующие действия, выполняемые данным методом. 20 | Если тип возвращаемого значения не void, в теле метода должен быть хотя бы один оператор 21 | 22 | return выражение; 23 | 24 | 25 | где тип выражения должен совпадать с типом возвращаемого значения. Этот оператор возвращает результат вычисления выражения в точку вызова метода. 26 | Если тип возвращаемого значения – void, возврат из метода выполняется либо после выполнения последнего оператора тела метода, либо в результате выполнения оператора 27 | return; 28 | (таких операторов в теле метода может быть несколько). 29 | Пример объявления метода, возвращающего значение типа int – сумму двух своих параметров типа int: 30 | 31 | int sum(int a, int b) 32 | { 33 | int x; 34 | x = a + b; 35 | return x; 36 | } 37 | 38 | (тело цикла можно также записать с помощью одного оператора: return a + b). 39 | При вызове метода, например, sum(5, 3), параметры 5 и 3 передаются в метод, как значения соответственно a и b, и оператор вызова метода sum(5, 3)– заменяется значением, возвращаемым методом (8). 40 | В отличие от языка C, в котором тип параметра, задаваемого при вызове, приводится к типу параметра в объявлении функции, тип задаваемого параметра в Java должен строго соответствовать типу параметра в объявлении метода, поэтому вызов метода sum(1.5, 8) приведет к ошибке при компиляции программы. 41 | В языке Java в пределах одного класса можно определить два или более ме­тодов, которые совместно используют одно и то же имя, но имеют разное количество параметров. Когда это имеет место, методы называют перегру­женными, а о процессе говорят как о перегрузке метода (method overloading). 42 | Когда метод вызывается, то по количеству параметров и/или их типам среда выполнения Java определяет, какую именно версию перегруженного метода надо вызывать (тип возвращаемого значения во внимание не принимается, хотя, в принципе, он тоже может отличаться у разных версий перегруженных методов). 43 | Например, метод 44 | 45 | double sum(double a, double b) 46 | { 47 | double x; 48 | x = a + b; 49 | return x; 50 | } 51 | 52 | 53 | вместе с объявленным ранее методом int sum(int a, int b) составляют пару перегруженных методов и при вызове sum(5, 8) будет вызван первый метод, а при вызове sum(5.0, 8.0) будет вызван второй метод. 54 | По умолчанию метод, как и переменная, доступен только классам в том же пакете (наборе классов), что и исходный класс. Если перед возвращаемым типом задан модификатор доступа public, то метод является глобальным и доступен любым объектам, а модификатор private означает, что метод доступен в том классе, в котором он был объявлен, т.е. метод инкапсулирован в данном классе. 55 | В программе на языке Java можно использовать методы, реализация которых, выполнена во внешнем файле, в программе написанном на языке C/C++. Для этого перед определением метода (но без тела метода) указывается модификатор native, например: 56 | 57 | native int CalcTotal(); 58 | -------------------------------------------------------------------------------- /JavaRush/Simple_type_in_Java.txt: -------------------------------------------------------------------------------- 1 | Примитивные типы Java 2 | 3 | http://info.javarush.ru/javarush_articles/2015/12/01/%D0%9F%D1%80%D0%B8%D0%BC%D0%B8%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5-%D1%82%D0%B8%D0%BF%D1%8B-Java.html 4 | 5 | Как уже говорилось, в Java определены следующие примитивные типы: 6 | целые типы; 7 | вещественные типы; 8 | булевский тип. 9 | За оператором объявления примитивной переменной может следовать оператор инициализации "=", с помощью которого созданной переменной присваи­вается начальное значение. 10 | 11 | 1. Целые типы переменных 12 | 13 | Целые типы различаются по размеру отведенной для них памяти. Характеристики целочисленных типов приведены в табл. 1.1. 14 | Табл. 1.1. Характеристики целочисленных типов Java 15 | 16 | 17 | 18 | Как видно из приведенной таблицы, целые переменные, за исключением типа char, считаются в языке Java переменными со знаком. 19 | Целочисленные константы могут задаваться в программе одним из трех способов: в виде десятичных, шестнадцатеричных и восьмеричных значений. По умолчанию все числа интерпретируются как десятичные и относятся к типу int. Явно указать принадлежность к типу long можно, добавив в конце числа букву «l» или букву «L». 20 | Шестнадцатеричное значение задается с помощью символов «0x» или «0X», за которым значение числа (цифры 0-9 и буквы A-F или a-f), например: 0x7FFF. 21 | Число в восьмеричной записи должно начинаться с нуля, за которым следует одна или несколько восьмеричных цифр, например 077777. 22 | Восьмеричные и шестнадцатеричные числа могут быть как положительными, так и отрицательными и изменяются в тех же диапазонах, что и числа в десятичном представлении (например, шестнадцатеричные числа типа byte имеют максимальное значение 0x7F и минимальное значение -0x80, а восьмеричные – соответственно 177 и — 200) 23 | Примеры объявления целых переменных: 24 | 25 | int x = 0; 26 | long i, j, k; 27 | byte a1 = 0xF1, a2 = 0x07; 28 | short r1 = 017; 29 | 30 | 31 | Символы в Java определяются с помощью ключевого слова char и реализованы с использованием стандарта Unicode. Можно задать константу-символ в про­грамме или как обычный символ. Символьное значение должны быть заключено в пару одиночных апострофов, например 32 | 33 | char symbol='f'; 34 | 35 | 36 | Другой способ записи символов: пара символов "\u", за которой следует четырехзначное шестнадцатеричное число (в диапазоне от 0000 до FFFF), представляющее собой код символа в Unicode, например 37 | 38 | char symbol = '\u0042'; 39 | 40 | 41 | Некоторые символы, отсутствующие на клавиатуре, можно задавать с помощью так называемых escape-последовательностей, содержащих символ "\", за которым следует буквенный символ, идентифицирующий escape-последовательность, как показано в табл. 1.2. 42 | Табл. 1.2. Escape-последовательности, используемые в языке Java 43 | 44 | 45 | 46 | 2. Вещественные типы переменных 47 | 48 | Язык Java поддерживает числа и переменные с плавающей точкой обычной и двойной разрядности – типы float и double. 49 | Для чисел с плавающей точкой нужно указывает целую и дробную часть, разделенные точкой, например 4.6 или 7.0. Для больших чисел можно использовать экспоненциальную форму записи (для отделения мантиссы от порядка используется символ «e» или символ «E»), например, число -3,58×107 записывается как –3.58E7, а число 73,675×10-15 – как 73.675e-15. 50 | Характеристики вещественных типов Java представлены в табл. 2.1. 51 | Табл. 2.1. Характеристики вещественных типов Java 52 | 53 | 54 | 55 | Переменные с плавающей точкой могут хранить не только численные значения, но и любой из особо определенных флагов (состоянии): отрицательная беско­нечность, отрицательный нуль, положительная бесконечность, положительный нуль и «отсутствие числа» (not-a-number, NaN). 56 | Все константы с плавающей точкой подразумеваются принадлежащими к типу double. Чтобы задать число типа float, необходимо добавить в его конец символ «f» или символ «F». 57 | Примеры объявления переменных с плавающей точкой: 58 | 59 | float x1 = 3.5f, x2 = 3.7E6f, x3 = -1.8E-7f; 60 | double z = 1.0; 61 | 62 | 63 | 3. Булевский тип переменных 64 | 65 | Переменные булевского типа (логические переменные) могут принимать одно из двух значений: «истина» или «ложь» и используются в языках программирования в операциях отношения (сравнения) и логических операциях. Так, результатом сравнения 66 | 5 > 3 67 | будет «истина», а результатом сравнения 68 | 8 < 1 69 | будет «ложь». 70 | В отличие от C, где результату «ложь» сопоставлено целое значение типа int, равное 0, а результату «истина» – ненулевое значение типа int, и, соответственно, результатам сравнения присваивается целое значение (обычно 0 или 1), в Java для булевских переменных введен свой, отдельный тип данных. 71 | Переменные булевского типа в Java задаются с помощью ключевого слова boolean и могут иметь лишь одно из двух значений: true или false, например 72 | 73 | boolean switch = true; 74 | -------------------------------------------------------------------------------- /JavaRush/readme.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Java_MailRu_1/2.3.3.java: -------------------------------------------------------------------------------- 1 | Задание: 2 | interface A { 3 | 4 | int sum(int x, int y); 5 | 6 | } 7 | 8 | class B implements A{ 9 | 10 | public int diff(int x, int y){return x - y;} 11 | 12 | public int sum(int x, int y){return x + y;} 13 | 14 | } 15 | 16 | class C extends B{ 17 | 18 | public int mult(int x, int y){return x * y;} 19 | 20 | public int diff(int x, int y){return y - x;} 21 | 22 | } 23 | 24 | 25 | 26 | A aB = new B(); 27 | 28 | A aC = new C(); 29 | 30 | B bB= new B(); 31 | 32 | B bC= new C(); 33 | 34 | C cC = new C(); 35 | 36 | Отметьте выражения которые могут быть скомпиллированы и результат вычисления которых true 37 | 38 | aB.diff(1,1) == 0; 39 | aC.sum(1,1)==2; + 40 | bC.diff(1,2) ==1; + 41 | bB.diff(1,2)==1; 42 | bC.mult(2,2)==4; 43 | 44 | Use : 45 | http://www.browxy.com/ 46 | 47 | Test: 48 | interface A { 49 | 50 | int sum(int x, int y); 51 | 52 | } 53 | 54 | class Id 55 | { 56 | public static void main (String[] args) throws java.lang.Exception 57 | { 58 | 59 | class B implements A{ 60 | 61 | public int diff(int x, int y){return x - y;} 62 | 63 | public int sum(int x, int y){return x + y;} 64 | 65 | } 66 | class C extends B{ 67 | 68 | public int mult(int x, int y){return x * y;} 69 | 70 | public int diff(int x, int y){return y - x;} 71 | 72 | } 73 | 74 | A aB = new B(); 75 | 76 | A aC = new C(); 77 | 78 | B bB= new B(); 79 | 80 | B bC= new C(); 81 | 82 | C cC = new C(); 83 | 84 | //aB.diff(1,1); 85 | //System.out.println(bB.diff(1,2)); //-1 86 | System.out.println(bC.diff(1,2)); //1 87 | //bC.mult(2,2); 88 | System.out.println(aC.sum(1,1)); //2 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Java-SE 2 | Изучение Java SE и пример кода 3 | 4 | I Термины 5 | 6 | 1.JDK - "Набор инструментов для разработки Java-программ, включая компилятор." 7 | 8 | 2.JRE - "Набор инструментов для запуска Java-программ, включая виртуальную машину." 9 | 10 | 3.JVM - "Виртуальная машина Java." 11 | 12 | 4.JIT - "Подход к реализации виртуальной машины, при котором байткод не 13 | интерпретируется, а компилируется в машинный код для исполнения аппаратным процессором" 14 | 15 | 5.JAR - "Формат архива, в который обычно упаковывают Java-программы и библиотеки" 16 | 17 | II Вопросы из лекций. 18 | 19 | 1.Что означает декларируемый Java принцип "Write once, run anywhere"? - "Скомпилированная Java-программа может быть запущена на любой платформе, где есть JVM." 20 | 21 | 2.Как называется двоичный формат, который понимает виртуальная машина? - "Bytecode (байткод)" 22 | 23 | 3.Что произойдет, если объявить метод main с неправильной комбинацией модификаторов, 24 | возвращаемого значения и параметров? - "Программа скомпилируется, но не запустится." 25 | 26 | 4.Может ли в одной программе быть несколько классов с методом main? - "Да" 27 | 28 | ХОрошая дока ! 29 | http://www.codejava.net/java-ee/servlet?limitstart=0 30 | 31 | http://java-course.ru/student/book1/unit-test/ !!! 32 | -------------------------------------------------------------------------------- /analys_text.java: -------------------------------------------------------------------------------- 1 | Решение задачи Частотный анализ текста. 2 | 3 | import java.io.IOException; 4 | import java.util.Comparator; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | import java.util.Scanner; 8 | 9 | public class Main { 10 | 11 | public static void main(String[] args) throws IOException { 12 | // Для чтения входного потока используем Scanner. 13 | // Поскольку словами мы считаем последовательности символов, 14 | // состоящие из букв или цифр, то в качестве разделителя слов Scanner'у 15 | // указываем регулярное выражение, означающее 16 | // "один или более символ, не являющийся ни буквой, ни цифрой". 17 | Scanner scanner = new Scanner(System.in, "UTF-8") 18 | .useDelimiter("[^\\p{L}\\p{Digit}]+"); 19 | 20 | // Пройдем по всем словам входного потока и составим Map, 21 | // где ключом является слово, преобразованное в нижний регистр, 22 | // а значением - частота этого слова. 23 | Map freqMap = new HashMap<>(); 24 | scanner.forEachRemaining(s -> freqMap.merge(s.toLowerCase(), 1, (a, b) -> a + b)); 25 | 26 | freqMap.entrySet().stream() // получим стрим пар (слово, частота) 27 | .sorted(descendingFrequencyOrder()) // отсортируем 28 | .limit(10) // возьмем первые 10 29 | .map(Map.Entry::getKey) // из каждой пары возьмем слово 30 | .forEach(System.out::println); // выведем в консоль 31 | } 32 | 33 | // Создание Comparator'а вынесено в отдельный метод, чтобы не загромождать метод main. 34 | private static Comparator> descendingFrequencyOrder() { 35 | // Нам нужен Comparator, который сначала упорядочивает пары частоте (по убыванию), 36 | // а затем по слову (в алфавитном порядке). Так и напишем: 37 | return Comparator.>comparingInt(Map.Entry::getValue) 38 | .reversed() 39 | .thenComparing(Map.Entry::getKey); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /encode.java: -------------------------------------------------------------------------------- 1 | import java.util.*; 2 | 3 | class Main { 4 | public static void main(String[] args){ 5 | Scanner sc = new Scanner(System.in); 6 | int n_s = sc.nextInt(); 7 | int len_en_coding_s = sc.nextInt(); 8 | 9 | HashMap codewords = new HashMap(); 10 | for(int i = 0; i < n_s; i++){ 11 | char chr_s = sc.next().charAt(0); 12 | String codeword = sc.next(); 13 | codewords.put(codeword, chr_s); 14 | } 15 | 16 | String encoded = sc.next(); 17 | String unencoded = new String(); 18 | String word = new String(); 19 | for(int i = 0; i < encoded.length(); i++){ 20 | word += encoded.charAt(i); 21 | if(codewords.containsKey(word)){ 22 | unencoded += codewords.get(word); 23 | word = new String(); 24 | } 25 | } 26 | System.out.println(unencoded); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /mailService.java: -------------------------------------------------------------------------------- 1 | Решение задачи MailService. 2 | 3 | // MailMessage и Salary имеют практически идентичный интерфейс 4 | // за исключением типа поля content. Давайте абстрагируем это знание в интерфейс. 5 | public static interface Sendable { 6 | String getFrom(); 7 | String getTo(); 8 | T getContent(); 9 | } 10 | 11 | 12 | // Абстрагируем логику хранения всех элементов класса во внутренних полях класса, 13 | // создав класс SimpleSendable. Не забудем указать реализуемый интерфейс. 14 | public static class SimpleSendable implements Sendable { 15 | private String from, to; 16 | private T content; 17 | 18 | public SimpleSendable(String from, String to, T content) { 19 | this.from = from; 20 | this.to = to; 21 | this.content = content; 22 | } 23 | 24 | @Override 25 | public String getFrom() { 26 | return from; 27 | } 28 | 29 | @Override 30 | public String getTo() { 31 | return to; 32 | } 33 | 34 | @Override 35 | public T getContent() { 36 | return content; 37 | } 38 | } 39 | 40 | 41 | // Теперь объявим MailMessage и Salary, отнаследовавшись от SimpleSendable 42 | // с конкретным параметром типа. 43 | public static class MailMessage extends SimpleSendable { 44 | public MailMessage(String from, String to, String content) { 45 | super(from, to, content); 46 | } 47 | } 48 | 49 | 50 | public static class Salary extends SimpleSendable { 51 | public Salary(String from, String to, Integer content) { 52 | super(from, to, content); 53 | } 54 | } 55 | 56 | 57 | // forEachOrdered и forEach ожидают в качестве аргумента класс, 58 | // реализующий интерфейс Consumer. 59 | // Судя по исходному коду, Consumer потребляет письма с содержимым, 60 | // соответствующим параметру класса MailService. 61 | public static class MailService implements Consumer> { 62 | 63 | // Если внимательно посмотреть на исходный код задания, можно заметить, 64 | // что логика метода get у получаемого в getMailBox Map'а при отсутствующем элементе 65 | // отличается от логики стандартных коллекций. Переназначим эту логику в анонимном 66 | // наследнике HashMap. 67 | private Map> messagesMap = new HashMap>(){ 68 | @Override 69 | public List get(Object key) { 70 | if (this.containsKey(key)) { 71 | // Возвращать изменяемый список во внешний мир – не очень хорошая идея 72 | // по причине того, что его изменение может испортить внутреннее состояние 73 | // словаря. Лучше оборачивать подобный вывод в 74 | // Collections.unmodifiableList. 75 | // Однако здесь мы не можем так поступить по причине того, 76 | // что добавлять новые элементы в списки из accept будет неудобно. 77 | // Нужно реализовать дополнительный метод getMutable, который возвращал 78 | // бы изменяемый список, удобный для модификации. 79 | // Но добавить новый метод мы можем только в именованный класс. 80 | return super.get(key); 81 | } else { 82 | // Collections.emptyList() возвращает один и тот же экземпляр 83 | // неизменяемого списка. Если бы мы возвращали здесь, допустим, 84 | // new ArrayList<>(), то множество вызовов get по отсутвующему 85 | // элементу создавало бы множество лишних объектов. 86 | return Collections.emptyList(); 87 | } 88 | } 89 | }; 90 | 91 | @Override 92 | public void accept(Sendable sendable) { 93 | List ts = messagesMap.get(sendable.getTo()); 94 | if (ts.size() == 0) { 95 | ts = new ArrayList<>(); 96 | } 97 | ts.add(sendable.getContent()); 98 | messagesMap.put(sendable.getTo(), ts); 99 | } 100 | 101 | public Map> getMailBox() { 102 | return messagesMap; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /mail_service.java: -------------------------------------------------------------------------------- 1 | 2 | 3 | Решение задачи Почтовая служба. 4 | 5 | // Непроверяемые исключения – наследники RuntimeException 6 | public static class StolenPackageException extends RuntimeException { 7 | } 8 | 9 | 10 | public static class IllegalPackageException extends RuntimeException { 11 | } 12 | 13 | 14 | public static class UntrustworthyMailWorker implements MailService { 15 | // Внутренний экземпляр RealMailService можно объявит прямо в поле, 16 | // или же, например, в конструкторе. 17 | private static final MailService realService = new RealMailService(); 18 | private final MailService[] agents; 19 | 20 | public UntrustworthyMailWorker(final MailService[] agents) { 21 | this.agents = agents; 22 | } 23 | 24 | public MailService getRealMailService() { 25 | return realService; 26 | } 27 | 28 | @Override 29 | public Sendable processMail(Sendable mail) { 30 | for (MailService agent : agents) { 31 | mail = agent.processMail(mail); 32 | } 33 | return realService.processMail(mail); 34 | } 35 | } 36 | 37 | 38 | public static class Spy implements MailService { 39 | private final Logger logger; 40 | 41 | public Spy(final Logger logger) { 42 | this.logger = logger; 43 | } 44 | 45 | @Override 46 | public Sendable processMail(Sendable mail) { 47 | if (mail instanceof MailMessage) { 48 | String direction = "from " + mail.getFrom() + " to " + mail.getTo(); 49 | if (isTargetMail(mail)) { 50 | // Здесь так же неплохо выглядел бы вызов логгера с объектными параметрами. 51 | logger.warning( 52 | "Detected target mail correspondence: " 53 | + direction + " \"" + ((MailMessage) mail).getMessage() + "\""); 54 | } else { 55 | logger.info("Usual correspondence: " + direction); 56 | } 57 | } 58 | return mail; 59 | } 60 | 61 | private boolean isTargetMail(Sendable mail) { 62 | // Сравнивать объекты на равенство лучше всего через метод объекта, 63 | // который не может равнятся null. 64 | // Это помогает избегать неожиданных NullPointerException. 65 | // Если оба объекта могут быть null, может помочь Objects.equals 66 | return AUSTIN_POWERS.equals(mail.getFrom()) || AUSTIN_POWERS.equals(mail.getTo()); 67 | } 68 | } 69 | 70 | 71 | public static class Inspector implements MailService { 72 | 73 | private static final String[] ILLEGAL_CONTENT = 74 | new String[]{WEAPONS, BANNED_SUBSTANCE}; 75 | 76 | @Override 77 | public Sendable processMail(Sendable mail) { 78 | if (mail instanceof MailPackage) { 79 | MailPackage mailPackage = (MailPackage) mail; 80 | if (mailPackage.getContent().getContent().contains("stones")) { 81 | throw new StolenPackageException(); 82 | } 83 | for (String illegalString : ILLEGAL_CONTENT) { 84 | if (mailPackage.getContent().getContent().contains(illegalString)) { 85 | throw new IllegalPackageException(); 86 | } 87 | } 88 | } 89 | return mail; 90 | } 91 | } 92 | 93 | 94 | public static class Thief implements MailService { 95 | private final int minValueToSteal; 96 | private int stolenValue = 0; 97 | 98 | public Thief(int minValueToSteal) { 99 | this.minValueToSteal = minValueToSteal; 100 | } 101 | 102 | public int getStolenValue() { 103 | return stolenValue; 104 | } 105 | 106 | @Override 107 | public Sendable processMail(Sendable mail) { 108 | if (mail instanceof MailPackage) { 109 | Package content = ((MailPackage) mail).getContent(); 110 | if (content.getPrice() >= minValueToSteal) { 111 | stolenValue += content.getPrice(); 112 | return new MailPackage( 113 | mail.getFrom(), mail.getTo(), stolenPackage(content)); 114 | } else 115 | return mail; 116 | } else { 117 | return mail; 118 | } 119 | } 120 | 121 | private Package stolenPackage(Package content) { 122 | return new Package("stones instead of " + content.getContent(), 0); 123 | } 124 | } 125 | 126 | -------------------------------------------------------------------------------- /min_max.java: -------------------------------------------------------------------------------- 1 | Решение задачи Минимум и максимум. 2 | 3 | У стрима есть методы min() и max(), но воспользоваться ими «в лоб» нельзя, т.к. оба являются терминальными 4 | операциями. Использовав одну из них, вторую уже вызвать нельзя — стрим бросит IllegalStateException. 5 | Некоторые обходили это ограничение, 6 | собирая элементы стрима в коллекцию, из которой можно было получить новый стрим столько раз, сколько нужно. 7 | Это решение проходит тесты, но его большой недостаток — необходимость хранить в памяти все элементы стрима, 8 | которых может быть очень много. Мы заранее не знаем, сколько их будет. 9 | 10 | Оптимальным решением является нахождение минимума и максимума за один проход по стриму без использования 11 | промежуточного хранилища элементов. Сделать это несложно: 12 | 13 | public static void findMinMax( 14 | Stream stream, 15 | Comparator order, 16 | BiConsumer minMaxConsumer) { 17 | 18 | MinMaxFinder minMaxFinder = new MinMaxFinder<>(order); 19 | stream.forEach(minMaxFinder); 20 | minMaxConsumer.accept(minMaxFinder.min, minMaxFinder.max); 21 | } 22 | 23 | 24 | private static class MinMaxFinder implements Consumer { 25 | 26 | private final Comparator order; 27 | T min; 28 | T max; 29 | 30 | private MinMaxFinder(Comparator order) { 31 | this.order = order; 32 | } 33 | 34 | @Override 35 | public void accept(T t) { 36 | if (min == null || order.compare(t, min) < 0) { 37 | min = t; 38 | } 39 | if (max == null || order.compare(max, t) < 0) { 40 | max = t; 41 | } 42 | } 43 | } 44 | 45 | Обратите внимание, что решение не использует приведение типа к (T). Благодаря этому отсутствуют 46 | предупреждения компилятора о небезопасном приведении типов. В других решениях, где Consumer 47 | реализован как лямбда-выражение или как анонимный класс, избежать предупреждений было бы гораздо сложнее. 48 | 49 | P.S. В лекциях были рассмотрены только последовательные стримы, однако в Java бывают еще 50 | и параллельные стримы, обрабатывающие свои элементы одновременно в нескольких потоках. 51 | Это решение для параллельных стримов не подходит. Но это уже совсем другая история... 52 | -------------------------------------------------------------------------------- /split_string.java: -------------------------------------------------------------------------------- 1 | http://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args){ 6 | String isAccessible = null; 7 | String[] partsAccesible = null; 8 | 9 | isAccessible = "F; сообщение об ошибке"; 10 | 11 | partsAccesible = isAccessible.split(";"); 12 | String partAccesible1 = partsAccesible[0]; 13 | String partAccesible2 = partsAccesible[1]; 14 | System.out.println( partAccesible2); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ternary_operator.java: -------------------------------------------------------------------------------- 1 | 2 | 3 | Разбор задачи Тернарный оператор на функциональных интерфейсах. 4 | 5 | Метод ternaryOperator() должен вернуть экземпляр Function. Поскольку Function — функциональный интерфейс, есть следующие способы его инстанцировать: 6 | 7 | создать экземпляр анонимного или именованного класса, реализующего интерфейс Function; 8 | воспользоваться ссылкой на метод; 9 | написать лямбда-выражение. 10 | 11 | Компактнее всего будет решение через лямбда-выражение, именно его и ожидает проверяющая система. В итоге решение записывается в одну строку: 12 | 13 | return x -> condition.test(x) ? ifTrue.apply(x) : ifFalse.apply(x); 14 | 15 | 16 | Надо помнить, что condition, ifTrue и ifFalse — это обычные объекты, у них есть методы. Если забыли, какие у них методы, то можно воспользоваться подсказкой IDE или сходить в JavaDoc/исходники интерфейсов Predicate и Function. Нельзя просто взять и написать: 17 | 18 | return condition(x) ? ifTrue(x) : ifFalse(x); // это не скомпилируется 19 | 20 | 21 | В задаче был дополнительный вопрос про сигнатуру метода ternaryOperator(). Почему он объявлен именно так, а не более простым способом, без всяких и ? Можно ведь было объявить его так: 22 | 23 | public static Function ternaryOperator( 24 | Predicate condition, 25 | Function ifTrue, 26 | Function ifFalse) 27 | 28 | Если метод ternaryOperator() объявить таким способом, то код из примера не скомпилируется. В Java типы Predicate и Predicate несовместимы, поэтому нельзя передать Predicate в метод, ожидающий Predicate. 29 | 30 | Это касалось . Если же вместо использовать , то не скомпилируется следующий пример, т.к. несовместимыми являются типы Function и Function. 31 | 32 | Predicate condition = Objects::isNull; 33 | Function ifTrue = obj -> "null"; 34 | Function ifFalse = Object::toString; 35 | Function objectToCharSequence = 36 | ternaryOperator(condition, ifTrue, ifFalse); 37 | 38 | --------------------------------------------------------------------------------