maven

Друзья, не повторяйте моей ошибки.Не пытайтесь изучить Maven полностью и досконально.

Для чего необходим maven

 Во первых для подключения в проект дополнительных библиотек. 
 Во вторых для подключения разнообразных плагинов, которые будут обрабатывать ваш код. Например плагин для создания из jar файла, файл exe. Или плагин для обфускации вашего кода.Или плагин для проверки вашего кода на наличие багов. Существует плагин для оптимизации кода. И т.д. 
В третьих maven создает каркас вашего будущего проекта. Т.е. он сам создает структуру папок и файлов вашего проекта, в зависимости от выбранного типа создаваемого программного обеспечения. 
В общем то этого достаточно знать.Если что то понадобится большее в работе, всегда можно доучить в процессе.

Collections

Несколько заданий из квеста Collections

/* В метод main приходит список аргументов.
Первый аргумент - имя результирующего файла resultFileName, остальные аргументы - имена файлов fileNamePart.
Каждый файл (fileNamePart) - это кусочек zip архива. Нужно разархивировать целый файл, собрав его из кусочков.
Записать разархивированный файл в resultFileName.
Архив внутри может содержать файл большой длины, например, 50Mb.
Внутри архива может содержаться файл с любым именем.
 Пример входных данных. Внутри архива находится один файл с именем abc.mp3:
C:/result.mp3
C:/pathToTest/test.zip.003
C:/pathToTest/test.zip.001
C:/pathToTest/test.zip.004
C:/pathToTest/test.zip.002
 Требования:
 •
 В методе main нужно создать ZipInputStream для архива, собранного из кусочков файлов. Файлы приходят аргументами в main, начиная со второго. 
•
 Создай поток для записи в файл, который приходит первым аргументом в main. Запиши туда содержимое файла из архива. 
•
 Поток для чтения из архива должен быть закрыт. 
•
 Поток для записи в файл должен быть закрыт. 

Разархивируем файл
*/
public class Solution {
    public static void main(String[] args) {
    }
}

Следующее задание:

/*
В отдельных файлах создай классы Service, Model, View, Controller.
Распредели методы из класса Solution по созданным классам учитывая, что должен получиться MVC.
Создай нужные поля класса при необходимости.
Не добавляй своих других методов.
Метод main() оставь в классе Solution.
 Требования:
 •
 Создай класс Service в отдельном файле. 
•
 Создай класс Model в отдельном файле. 
•
 Создай класс View в отдельном файле. 
•
 Создай класс Controller в отдельном файле. 
•
 Перемести реализацию метода getData() в подходящий класс. 
•
 Перемести реализацию метода getStringDataList() в подходящий класс. Учти, что метод getData() находится не в классе Solution. 
•
 Перемести реализацию метода onShowDataList() в подходящий класс. Учти, что метод getStringDataList() находится не в классе Solution. 
•
 Перемести реализацию метода fireShowDataEvent() в подходящий класс. Учти, что метод onShowDataList() находится не в классе Solution. 
•
 Метод main() должен создать объект типа View и вызвать у него подходящий метод. Поведение программы не должно измениться. 
*/
import java.util.ArrayList;
import java.util.List;

/* 
MVC - простая версия
*/
public class Solution {
    public static void main(String[] args) {
        new Solution().fireShowDataEvent();
    }

    public List<String> getData() {
        List<String> data = new ArrayList<String>() {{
            add("First string");
            add("Second string");
            add("Third string");
        }};
        return data;
    }

    public void fireShowDataEvent() {
        System.out.println(onShowDataList());
    }

    public List<String> getStringDataList() {
        return getData();
    }

    public List<String> onShowDataList() {
        return getStringDataList();
    }
} 

Следующее задание с несколькими классами:

/*
Аргументом для класса Solution является абсолютный путь к пакету.
Имя пакета может содержать File.separator.
В этом пакете кроме скомпилированных классов (.class) могут находиться и другие файлы (например: .java).
Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс HiddenClass.
Считай все классы с файловой системы, создай фабрику - реализуй метод getHiddenClassObjectByKey.
Примечание: в пакете может быть только один класс, простое имя которого начинается с String key без учета регистра.
 Требования:
 •
 Реализуй метод scanFileSystem, он должен добавлять в поле hiddenClasses найденные классы. 
•
 Реализуй метод getHiddenClassObjectByKey, он должен создавать объект класса согласно условию задачи. 
•
 Метод main не изменяй. 
•
 Метод getHiddenClassObjectByKey не должен кидать исключений.
*/
 package com.javarush.task.task36.task3606;

public interface HiddenClass {
} 


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class FirstHiddenClassImpl implements HiddenClass {
}

Класс

package com.javarush.task.task36.task3606;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/* 
Осваиваем ClassLoader и Reflection
*/
public class Solution {
    private List<Class> hiddenClasses = new ArrayList<>();
    private String packageName;

    public Solution(String packageName) {
        this.packageName = packageName;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Solution solution = new Solution(Solution.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "com/javarush/task/task36/task3606/data/second");
        solution.scanFileSystem();
        System.out.println(solution.getHiddenClassObjectByKey("secondhiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("firsthiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("packa"));
    }

    public void scanFileSystem() throws ClassNotFoundException {
    }

    public HiddenClass getHiddenClassObjectByKey(String key) {
        return null;
    }
}


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class SecondHiddenClassImpl implements HiddenClass {
    private SecondHiddenClassImpl() {
    }
}
package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

class PackageAccessClass implements HiddenClass {
    PackageAccessClass() {
    }
}
 

Multitreading

Несколько заданий из квеста Multitreading

/*
  Реализуй логику метода interrupt, который должен прерывать трэд предварительно закрыв используемые ресурсы.
Используй метод super-класса в блоке finally.
 Требования:
 •
 Сигнатуру метода interrupt менять нельзя. 
•
 Метод interrupt должен закрывать используемые классом Solution ресурсы. 
•
 Затем, метод interrupt должен прерывать трэд (вызов super.interrupt). 
•
 Трэд должен быть прерван в любом случае, даже если во время закрытия ресурсов было выкинуто исключение. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task25.task2507;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/* 
Работать в поте лица!
*/
public class Solution extends Thread {
    private static final int BUFFER_SIZE = 2000;    //2000 bytes
    private final Socket socket;
    private final InputStream in;

    public Solution(Socket socket) throws IOException {
        this.socket = socket;
        this.in = socket.getInputStream();
    }

    public void interrupt() {
        //implement logic here
    }

    public void run() {
        try {
            byte[] buf = new byte[BUFFER_SIZE];
            while (true) {
                int count = in.read(buf);
                if (count < 0) {
                    break;
                } else {
                    if (count > 0) {
                        //process buffer here
                    }
                }
            }
        } catch (IOException ignored) {}
    }

    public static void main(String[] args) {
    }
}  

Следующее задание:

/* 
1. Почитай про java.util.concurrent.Phaser.
2. Расставь методы в нужных местах:
- arriveAndDeregister() - начинает запускать методы run у тасок,
- arriveAndAwaitAdvance() - ждет, когда все трэды будут созданы.
 Пример вывода см. в output.txt.
Логика:
Сначала все персонажи присоединяются к игре.
После того, как все персонажи присоединятся к игре и готовы играть, выводится фраза "Игра началась!".
После этого персонажи вступают в игру, после чего умирают.
 Требования:
 •
 Класс Character менять не нужно. 
•
 Классы Plant и Zombie менять не нужно. 
•
 В классе Solution вызови метод phaser.arriveAndDeregister в правильном месте. 
•
 В классе Solution вызови метод phaser.arriveAndAwaitAdvance в правильном месте. 
 
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task28.task2809;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Phaser;

/* 
Plants vs Zombies
*/
public class Solution {
    public static void main(String[] args) throws InterruptedException {
        List<Character> characters = new ArrayList<>();
        characters.add(new Plant());
        characters.add(new Plant());
        characters.add(new Zombie());
        characters.add(new Zombie());
        characters.add(new Zombie());
        start(characters);
    }

    private static boolean isEveryoneReady = false;

    private static void start(List<Character> characters) throws InterruptedException {
        final Phaser phaser = new Phaser(1 + characters.size());

        for (final Character character : characters) {
            final String member = character.toString();
            System.out.println(member + " присоединился к игре");
            new Thread() {
                @Override
                public void run() {
                    System.out.println(member + " готовится играть");
                    if (!isEveryoneReady) {
                        isEveryoneReady = true;
                        System.out.println("Игра началась!");
                    }
                    character.run();
                }
            }.start();
        }
    }
}

 
 ///////////////////////////////////////////////////////////////////package com.javarush.task.task28.task2809;

import java.util.concurrent.atomic.AtomicInteger;

public class Zombie extends Character {
    private final static AtomicInteger idSequence = new AtomicInteger();
    private final int id = idSequence.incrementAndGet();

    protected int getId() {
        return id;
    }
}

 
 ///////////////////////////////////////////////////////////////////

package com.javarush.task.task28.task2809;

import java.util.concurrent.ThreadLocalRandom;

public abstract class Character implements Runnable {
    protected abstract int getId();

    public void run() {
        System.out.println(toString() + " вступил в игру");
        doSomething();
        System.out.println(toString() + " умер");
    }

    private void doSomething() {
        try {
            Thread.currentThread().sleep(ThreadLocalRandom.current().nextInt(10, 100));
        } catch (InterruptedException ignored) {
        }
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + " #" + getId();
    }

}

 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

.txt

Plant #1 присоединился к игре
Plant #2 присоединился к игре
Plant #1 готовится играть
Zombie #1 присоединился к игре
Zombie #2 присоединился к игре
Zombie #3 присоединился к игре
Plant #2 готовится играть
Zombie #2 готовится играть
Zombie #1 готовится играть
Zombie #3 готовится играть
Игра началась!
Zombie #1 вступил в игру
Zombie #3 вступил в игру
Plant #1 вступил в игру
Zombie #2 вступил в игру
Plant #2 вступил в игру
Zombie #2 умер
Plant #2 умер
Plant #1 умер
Zombie #3 умер
Zombie #1 умер
 ///////////////////////////////////////////////////////////////////

package com.javarush.task.task28.task2809;

import java.util.concurrent.atomic.AtomicInteger;

public class Plant extends Character {
    private final static AtomicInteger idSequence = new AtomicInteger();
    private final int id = idSequence.incrementAndGet();

    protected int getId() {
        return id;
    }
} 

Syntax

Несколько заданий из квеста Syntax

/*
 Задача: Пользователь вводит с клавиатуры список слов (и чисел).
Слова вывести в возрастающем порядке, числа - в убывающем.
 Пример ввода:
Вишня
1
Боб
3
Яблоко
22
0
Арбуз
 Пример вывода:
Арбуз
22
Боб
3
Вишня
1
0
Яблоко
 Требования:
 •
 Программа должна считывать данные с клавиатуры. 
•
 Программа должна выводить данные на экран. 
•
 Выведенные слова должны быть упорядочены по возрастанию (используй готовый метод isGreaterThan). 
•
 Выведенные числа должны быть упорядочены по убыванию. 
•
 Метод main должен использовать метод sort. 
•
 Метод sort должен использовать метод isGreaterThan. 
•
 Метод sort должен использовать метод isNumber. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task09.task0930;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

/* 
Задача по алгоритмам
*/

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> list = new ArrayList<>();
        while (true) {
            String s = reader.readLine();
            if (s.isEmpty()) {
                break;
            }
            list.add(s);
        }

        String[] array = list.toArray(new String[0]);
        sort(array);

        for (String x : array) {
            System.out.println(x);
        }
    }

    public static void sort(String[] array) {
        // напишите тут ваш код
    }

    // Метод для сравнения строк: 'а' больше чем 'b'
    public static boolean isGreaterThan(String a, String b) {
        return a.compareTo(b) > 0;
    }


    // Переданная строка - это число?
    public static boolean isNumber(String s) {
        if (s.length() == 0) {
            return false;
        }

        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if ((i != 0 &amp;&amp; c == '-') // Строка содержит '-'
                    || (!Character.isDigit(c) &amp;&amp; c != '-') // или не цифра и не начинается с '-'
                    || (chars.length == 1 &amp;&amp; c == '-')) // или одиночный '-'
            {
                return false;
            }
        }
        return true;
    }
} 

Следующее задание:

/*
По аналогии с классом Duck (утка) создай классы Cat (кошка) и Dog (собака).
Подумай, что должен возвращать метод toString в классах Cat и Dog?
В методе main создай по два объекта каждого класса и выведи их на экран.
Объекты класса Duck уже созданы и выводятся на экран.
 Требования:
 •
 Создай класс Cat(кошка). 
•
 Создай класс Dog(собака). 
•
 У класса Cat должен быть верно реализован метод toString. 
•
 У класса Dog должен быть верно реализован метод toString. 
•
 В методе main создай два объекта типа Cat. 
•
 В методе main создай два объекта типа Dog. 
•
 Выведи все созданные объекты на экран. 
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task05.task0525;

/* 
И целой утки мало
*/

public class Solution {

    public static void main(String[] args) {
        Duck duck1 = new Duck();
        Duck duck2 = new Duck();
        System.out.println(duck1);
        System.out.println(duck2);

        //напишите тут ваш код
    }

    public static class Duck {
        public String toString() {
            return "Duck";
        }
    }

    //напишите тут ваш код
}

Еще задание:

/*
 1. Внутри класса Solution создай public static классы Man и Woman.
2. У классов должны быть поля: name(String), age (int), address (String).
3. Создай конструкторы, в которые передаются все возможные параметры.
4. Создай по два объекта каждого класса со всеми данными используя конструктор.
5. Объекты выведи на экран в таком формате: name + " " + age + " " + address
 Требования:
 •
 В классе Solution создай public static класс Man. 
•
 В классе Solution создай public static класс Woman. 
•
 Класс Man должен содержать переменные: name(String), age(int) и address(String). 
•
 Класс Woman должен содержать переменные: name(String), age(int) и address(String). 
•
 У классов Man и Woman должны быть конструкторы, принимающие параметры с типами String, int и String. 
•
 Конструкторы должны инициализировать переменные класса. 
•
 В методе main необходимо создать по два объекта каждого типа. 
•
 Метод main должен выводить созданные объекты на экран в указанном формате. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task05.task0526;

/* 
Мужчина и женщина
*/

public class Solution {
    public static void main(String[] args) {
        //напишите тут ваш код
    }

    //напишите тут ваш код
}

И еще задание:

/*
Написать функцию, которая вычисляет минимум из четырёх чисел.
Функция min(a,b,c,d) должна использовать (вызывать) функцию min(a,b)
 Подсказка:
Нужно написать тело двух существующих функций min.
 Требования:
 •
 Программа должна выводить текст на экран. 
•
 Методы min не должны выводить текст на экран. 
•
 Метод main должен вызывать метод min(a, b) и метод min(a, b, c, d). 
•
 Метод main должен выводить на экран результат работы методов min. Каждый раз с новой строки. 
•
 Метод min(a, b) должен возвращать минимальное значение из чисел a, b. 
•
 Метод min(a, b, c, d) должен использовать метод min(a, b) 
•
 Метод min(a, b, c, d) должен возвращать минимальное значение из чисел a, b, c, d. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task02.task0217;

/* 
Минимум четырех чисел
*/
public class Solution {
    public static int min(int a, int b, int c, int d) {
        //напишите тут ваш код

    }

    public static int min(int a, int b) {
        //напишите тут ваш код

    }

    public static void main(String[] args) throws Exception {
        System.out.println(min(-20, -10));
        System.out.println(min(-40, -10, -30, 40));
        System.out.println(min(-20, -40, -30, 40));
        System.out.println(min(-20, -10, -40, 40));
        System.out.println(min(-20, -10, -30, -40));
    } 

Core

Несколько заданий из квеста Core

/* 1. Подумай, какой из двух интерфейсов нужно реализовать в классе BeerLover.
2. Добавь к классу BeerLover этот интерфейс и реализуй все его методы.
3. Подумай, как связаны переменная READY_TO_GO_HOME и метод isReadyToGoHome.
4. Верни значение переменной READY_TO_GO_HOME в методе isReadyToGoHome.
 Требования:
 •
 Класс BeerLover должен реализовывать(implements) интерфейс Alcoholic. 
•
 Класс BeerLover не должен реализовывать интерфейс Drinker напрямую(только опосредованно через Alcoholic) 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Alcoholic. 
•
 В классе BeerLover должны быть реализованы все методы интерфейса Drinker. 
•
 Метод isReadyToGoHome должен возвращать значение переменной READY_TO_GO_HOME. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task13.task1301;

/* 
Пиво
*/
public class Solution {
    public static void main(String[] args) throws Exception {
    }

    public interface Drinker {
        void askForMore(String message);

        void sayThankYou();

        boolean isReadyToGoHome();
    }

    public interface Alcoholic extends Drinker {
        boolean READY_TO_GO_HOME = false;

        void sleepOnTheFloor();
    }

    public static class BeerLover {

    }
} 

Еще задание:

/*
1. Переделай наследование в классах и интерфейсах так, чтобы программа компилировалась и продолжала делать то же самое.
2. Класс Hobby должен наследоваться от интерфейсов Desire, Dream.
 Требования:
 •
 Интерфейс Desire должен быть реализован в классе Hobby. 
•
 Интерфейс Dream должен быть реализован в классе Hobby. 
•
 Класс Hobby должен содержать статическую переменную INDEX. 
•
 Метод toString в классе Hobby должен инкрементировать и возвращать переменную INDEX в виде строки. 
 
 
*/
package com.javarush.task.task13.task1321;


/* 
Исправление ошибок
*/

public class Solution {

    public static void main(String[] args) {
        System.out.println(Dream.HOBBY.toString());
        System.out.println(new Hobby().INDEX);
    }

    interface Desire {
    }

    interface Dream implements Hobby {
        public static Hobby HOBBY = new Hobby();
    }

    static class Hobby extends Desire, Dream {
        static int INDEX = 1;

        @Override
        public String toString() {
            INDEX++;
            return "" + INDEX;
        }
    }

} 

И еще задание:

/*
1.Разберись, что делает программа. Официант почему-то не относит приготовленные блюда назад к столам :(
 2.Исправь ошибку.

 Требования:
 •
 Класс Restaurant должен содержать список поваров и официантов (public static поле threads типа List<Thread>). 
•
 Класс Manager должен содержать очередь с заказами (private final поле orderQueue типа Queue<Order>). 
•
 Класс Manager должен содержать очередь с готовыми блюдами (private final поле dishesQueue типа Queue<Dishes>). 
•
 Класс Manager должен реализовывать паттерн Singleton. 
•
 Класс Waiter должен реализовывать интерфейс Runnable. 
•
 Класс Cook должен реализовывать интерфейс Runnable. 
•
 Если нет готовых блюд в очереди, нить класса Waiter должна получать заказ от столика и добавлять его в очередь заказов. 
•
 Если есть готовые блюда в очереди, нить класса Waiter должна брать блюдо из очереди и относить заказ для столика. 
•
 Если нет заказов в очереди с заказами, нить класса Cook должна отдыхать (повар отдыхает). 
•
 Если есть заказы в очереди с заказами, нить класса Cook должна готовить блюдо и добавлять его в очередь с готовыми блюдами. 
 
 
 ///////////////////////////////////////////////////////////////////
*/
package com.javarush.task.task17.task1712;

import java.util.ArrayList;
import java.util.List;

/* 
Ресторан
*/

public class Restaurant {
    public static List<Thread> threads = new ArrayList<>();

    public static void main(String[] args) throws Exception {
        Waiter waiterTarget = new Waiter();
        Thread waiter = new Thread(waiterTarget);
        threads.add(waiter);

        Cook cookTarget = new Cook();
        Thread cook = new Thread(cookTarget);
        threads.add(cook);

        waiter.start();
        cook.start();

        Thread.sleep(2000);
        cookTarget.continueWorking = false;
        Thread.sleep(500);
        waiterTarget.continueWorking = false;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Dishes {
    private byte tableNumber;

    public Dishes(byte tableNumber) {
        this.tableNumber = tableNumber;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Table {
    private static byte tableNumber;
    private byte number = ++tableNumber;

    public Order getOrder () {
        return new Order(number);
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Order {
    private long time;
    private byte tableNumber;

    public Order(byte tableNumber) {
        time = (long) (Math.random() * 200);
        this.tableNumber = tableNumber;
    }

    public long getTime() {
        return time;
    }

    public byte getTableNumber() {
        return tableNumber;
    }
}

 
 ///////////////////////////////////////////////////////////////////
package com.javarush.task.task17.task1712;

public class Waiter implements Runnable {
    public boolean continueWorking = true;

    @Override
    public void run() {
        Manager manager = Manager.getInstance();

        while (continueWorking || !manager.getDishesQueue().isEmpty()) {
            if (!manager.getDishesQueue().isEmpty()) {       //относим готовый заказ
                Dishes dishes = manager.getDishesQueue().poll();
                System.out.println("Официант отнес заказ для стола №" + dishes.getTableNumber());
            } else {                                         //берем новый заказ
                Table table = manager.getNextTable();
                Order order = table.getOrder();
                System.out.println("Получен заказ от стола №" + order.getTableNumber());
                manager.getOrderQueue().add(order);
            }
            try {
                Thread.sleep(100);  //walking to the next table
            } catch (InterruptedException e) {
            }
        }
    }
}