Моя Lada Vesta

package com.javarush.test.level18.lesson10.home10;

/* Собираем файл
Собираем файл из кусочков
Считывать с консоли имена файлов
Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end"
В папке, где находятся все прочтенные файлы, создать файл без приставки [.partN]. Например, Lion.avi
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть все потоки ввода-вывода
Темповые файлы создавать нельзя, т.к. на сервере заблокирована возможность создания каких любо файлов
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> parts = new ArrayList<String>();         
        FileInputStream fileInputStream = null;         
        String nextFileName = null;
        //Читаем файлы пока не "end"

        while (true) {
            if ("end".equals(nextFileName = scanner.nextLine())) break;
            else parts.add(nextFileName);
        }
        scanner.close();
        //Сортируем коллекцию

        Collections.sort(parts, new Comparator<String>()
        {
            @Override
            public int compare(String o1, String o2)
            {
                return o1.toString().compareTo(o2.toString());    
            }
        });
        //Выходной файловый поток

        String outputFileName = parts.get(0).split(".part")[0];
        FileOutputStream fileOutputStream = new FileOutputStream(outputFileName);
        //Сливаем файлы

        for (String partsFileNames : parts) {
            fileInputStream = new FileInputStream(partsFileNames);
            byte[] buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            fileOutputStream.write(buffer);
            fileInputStream.close();
        }
        fileOutputStream.close();
        System.out.println("Объединение файлов выполнено!");
    }
}
package com.javarush.test.level18.lesson10.bonus01;

/* Шифровка
Придумать механизм шифровки/дешифровки

Программа запускается с одним из следующих наборов параметров:
-e fileName fileOutputName
-d fileName fileOutputName
где
fileName - имя файла, который необходимо зашифровать/расшифровать
fileOutputName - имя файла, куда необходимо записать результат шифрования/дешифрования
-e - ключ указывает, что необходимо зашифровать данные
-d - ключ указывает, что необходимо расшифровать данные
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Solution {
    public static void main(String[] args) throws IOException{
        String key = args[0];
        String fileInputName = args[1];
        String fileOutputName = args[2];
        FileInputStream fileInputStream = new FileInputStream(fileInputName);
        FileOutputStream fileOutputStream = new FileOutputStream(fileOutputName);
        if ("-e".equals(key)) {
            while (fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                if (data == 0xFF) data = 0x00;
                else data++;
                fileOutputStream.write(data);
            }
        }
        else if ("-d".equals(key)) {
            while (fileInputStream.available() > 0) {
                int data = fileInputStream.read();
                if (data == 0x00) data = 0xFF;
                else data--;
                fileOutputStream.write(data);
            }
        }
        fileInputStream.close();
        fileOutputStream.close();
        System.out.println("Выполнено!");
    }
}
package com.javarush.test.level18.lesson10.home09;

/* Файлы и исключения
Читайте с консоли имена файлов
Если файла не существует (передано неправильное имя файла), то
перехватить исключение, вывести в консоль переданное неправильное имя файла и завершить работу программы
Не забудьте закрыть все потоки
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) {
        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
        String f = "";
        while(true){
            try
            {
                try
                {
                    f = rdr.readLine();
                    File file = new File(f);
                    if (!file.exists()) throw new FileNotFoundException(f);
                }
                catch (FileNotFoundException e) {
                    System.out.println(f);
                    break;
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
package com.javarush.test.level19.lesson03.task03;

/* Адаптация нескольких интерфейсов
Адаптировать IncomeData к Customer и Contact.
Классом-адаптером является IncomeDataAdapter.
Инициализируйте countries перед началом выполнения программы. Соответствие кода страны и названия:
UA Ukraine
RU Russia
CA Canada
Дополнить телефонный номер нулями до 10 цифр при необходимости
*/

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static Map<String,String> countries = new HashMap<String,String>();

    static {
        countries.put("UA", "Ukraine");
        countries.put("RU", "Russia");
        countries.put("CA", "Canada");
        countries.put("US", "United States");
    }

    public static class IncomeDataAdapter implements Customer, Contact{
        private IncomeData incomeData;

        public IncomeDataAdapter(IncomeData incomeData)
        {
            this.incomeData = incomeData;
        }

        @Override
        public String getName()
        {
            return this.incomeData.getContactLastName() + ", " + this.incomeData.getContactFirstName();
        }

        @Override
        public String getPhoneNumber()
        {
            String clearPhoneNumber = Integer.valueOf(this.incomeData.getPhoneNumber()).toString();
            if (clearPhoneNumber.length() < 10) {
                while (clearPhoneNumber.length() < 10) clearPhoneNumber = "0" + clearPhoneNumber;
            }
            String newPhoneName = "+"
                    + this.incomeData.getCountryPhoneCode() + "(" + clearPhoneNumber.substring(0, 3)
                    + ")" + clearPhoneNumber.substring(3, 6) + "-" + clearPhoneNumber.substring(6,8)
                    + "-" + clearPhoneNumber.substring(8);
            return newPhoneName;
        }

        @Override
        public String getCompanyName()
        {
            return this.incomeData.getCompany();
        }

        @Override
        public String getCountryName()
        {
            String countryName = "";
            for (Map.Entry<String, String> pair : countries.entrySet()){
                if (pair.getKey().equals(this.incomeData.getCountryCode())) countryName = pair.getValue();
            }
            return countryName;
        }
    }

    public static interface IncomeData {
        String getCountryCode();        //example UA

        String getCompany();            //example JavaRush Ltd.

        String getContactFirstName();   //example Ivan

        String getContactLastName();    //example Ivanov

        int getCountryPhoneCode();      //example 38

        int getPhoneNumber();           //example 501234567

    }

    public static interface Customer {
        String getCompanyName();        //example JavaRush Ltd.

        String getCountryName();        //example Ukraine

    }

    public static interface Contact {
        String getName();               //example Ivanov, Ivan

        String getPhoneNumber();        //example +38(050)123-45-67

    }

    //Тестовый main

    public static void main(String[] args)
    {
        class iData implements IncomeData {

            @Override
            public String getCountryCode()
            {
                return "US";
            }

            @Override
            public String getCompany()
            {
                return "Planet Express";
            }

            @Override
            public String getContactFirstName()
            {
                return "Bender";
            }

            @Override
            public String getContactLastName()
            {
                return "Rodriguez";
            }

            @Override
            public int getCountryPhoneCode()
            {
                return 1;
            }

            @Override
            public int getPhoneNumber()
            {
                return 666666;
            }
        }
        IncomeDataAdapter adapter = new IncomeDataAdapter(new iData());
        System.out.println(adapter.getCompanyName());
        System.out.println(adapter.getCountryName());
        System.out.println(adapter.getPhoneNumber());
        System.out.println(adapter.getName());
    }
}

Reincarnation

reincarnation

Лексика языка Java состоит из следующих элементов: ключевые слова, разделители, идентификаторы, литералы, комментарии, операторы  и пробелы.

Ключевые слова

В настоящее время зарезервировано 50 ключевых слов. Эти слова, в сочетании с синтаксисом операторов и разделителями, образуют основу языка Java. Их нельзя использовать ни в качестве идентификаторов, ни для имен переменных, классов или методов.

 abstract continue for new switch
 assert default goto * package synchronized
boolean do if private this
 break  double implements  protected throw
 byte  else import public throws
case enum instanceof return  transient
catch  extends int short try
 char final interface static void
class finally long strictfp volatile
 const *  float native super while

* Ключевые слова goto и const зарезервированы, но не используются. Кроме того зарезервированы слова true, false и null. Их также нельзя использовать в качестве идентификаторов и т.д.

Разделители

В языке Java есть символы, которые используются как разделители. Чаще всего используется символ точка с запятой. Однако он не единственный.

() круглые скобки Используются для передачи списков параметров в определениях и вызовах методов. Их применяют также для определения приоритета в выражениях, выражений в управляющих операторах и преобразовании типов
 {} фигурные скобки Используются для указания значений автоматически инициализируемых массивов. Их применяют также для определения блоков кода, классов, методов и локальных областей видимости
[] квадратные скобки Используются для объявления типов массивов, а также при обращении к элементам массивов
; Точка с запятой Завершает операторы
, Запятая Разделяет последовательные идентификаторы в объявлениях переменных. Этот символ также используется для создания цепочек операторов внутри оператора for
. Точка Используется для отделения имен пактов от имен вложенных пакетов и классов, а также для отделения переменной или метода от ссылочной переменной

Идентификаторы

Идентификаторы используются для именования классов, методов и переменных. Идентификатором может служить любая последовательность строчных и прописных букв, цифр или символов подчеркивания (_) или доллара ($). Для общего использования символ доллара не предназначается. Идентификаторы не должны начинаться с цифры. Язык Java чувствителен к регистру символов, поэтому идентификаторы FIRST и First — являются различными. Стоит также отметить, что поскольку в Java в полной мере применяется Unicode, то в качестве «буквы» может использоваться также символ из армянского, корейского, грузинского, индийского и практически любого алфавита.

Литералы

В Java постоянное значение задается его литеральным представлением. Например:

100 896.34 ‘Y’ «Привет, мир!»

Первый литерал задает целочисленное значение, второй литерал задает значение с плавающей точкой, третий литерал — символьную константу, четвертый — строковое значение. Литерал можно использовать везде, где допустимо использование значений данного типа.

Комментарии

В Java есть 3 типа комментариев

1. Однострочные комментарии. Начинаются с символов // и длятся до конца строки.

// Это - однострочный комментарий

2. Многострочные комментарии. Начинаются символами /* и заканчиваются символами */. Например:

/* Это - многострочный
комментарий*/

3. Комментарии документации:

/** Это - комментарий 
документации Java*/

Комментарии данного типа используются для создания файла HTML документации программы.

Отступы

Java — язык свободной формы. При написании программы не нужно следовать никаким специальным правилам в отношении отступов. Единственное обязательное требование — наличие, по меньшей мере, одного пробела между лексемами, которые не разграничены оператором или разделителем. В Java отступами являются символы пробела, табуляции или символа новой строки.

Продолжение: Шаг 7. Две программы
Начало: Шаг 5. Объектно-ориентированное программирование «на пальцах»

Java — объектно-ориентированнный язык программирования. Что это означает? Что вообще такое объектно-ориентированное програмиирование (ООП)? Зачем оно нужно?

С этими вопросами мы постараемся разобраться подробно.

Все языки объектно-ориентированного программирования предоставляют механизмы, которые  облегчают реализацию объектно-ориентированной модели. Этими механизмами являются инкапсуляция, наследование, полиморфизм. Рассмотрим эти концепции.

Инкапсуляция

Основой инкапсуляции в Java является класс. Класс определяет данные и программный код некоторого набора объектов. Объект является экземпляром класса. Таким образом, класс — это логическая конструкция, а объект – физическая реальность. По сути, класс является шаблоном объекта, в классе описывается структура объекта, а когда объект создается, то он создается согласно данным описанным в классе, подобно тому как создается деталь на заводе согласно ее чертежу. При составлении класса код и данные необходимо специфицировать. Все эти элементы называют членами класса. Члены-переменные или переменные экземпляра или поля являются данными. Члены методы или просто методы – код, оперирующий этими данными.

Цель класса – инкапсуляция сложности. Для этого у методов и переменных внутри класса могут быть модификаторы доступа (public, private).

Инкапсуляция означает, что данные объекта недоступны его клиентам непосредственно. Вместо этого они инкапсулируются — скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным.

Статья не окончена и будет дописана.

Продолжение: Шаг 6. Лексические элементы языка Java
Начало: Шаг 4. Пример работы с классами и объектами

Случайно задумался о такой вещи. Мой сайт выполнен в трех основных цветах: красном, чёрном, и белом. А какие страны имеют флаги с таким (и только таким) набором цветов? Оказывается таких стран всего две.

Первая из них это Йемен.
Флаг Йемена
Флаг Йемена: Национальный флаг Йемена был принят 22 мая, 1990, в день объединения Северного Йемена и Южного Йемена. Красный, белый и чёрные цвета классические пан-арабистские, они так же присутствуют на флагах таких стран, как Египет, Сирия, Ирак.

Второй страной является Тринидад и Тобаго.
Флаг Тринидада и Тобаго
Флаг Тринидада и Тобаго: Флаг представляет собой прямоугольное полотнище красного цвета с диагональной (слева направо) чёрной полосой, по краям которой расположены две узкие белые полоски. Красный цвет флага обозначает жизнеспособность людей и земли страны, тепло и энергию солнца, мужество и дружелюбие народа. Белый цвет олицетворяет Карибское море и Атлантический океан, а также чистоту устремлений и равенство всех людей под Солнцем. Чёрный цвет символизирует связь всех людей Тринидада и Тобаго, единство цели и богатство земли. В совокупности все цвета представляют элементы земли, воды и огня, как вечные символы прошлое, настоящее и будущее. Принят 31 августа 1962 года.