├── 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 extends T> stream,
15 | Comparator super T> order,
16 | BiConsumer super T, ? super T> 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 super T> order;
27 | T min;
28 | T max;
29 |
30 | private MinMaxFinder(Comparator super T> 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(). Почему он объявлен именно так, а не более простым способом, без всяких super T> и extends U>? Можно ведь было объявить его так:
22 |
23 | public static Function ternaryOperator(
24 | Predicate condition,
25 | Function ifTrue,
26 | Function ifFalse)
27 |
28 | Если метод ternaryOperator() объявить таким способом, то код из примера не скомпилируется. В Java типы Predicate