• ,

Java и xml

Доброго времени суток!
Прошу помощи, интересует вопрос по работе с XML, необходимо чтобы программа выгружала информацию в формате XML, имеется XCD схема. Пытался разобрать схему на классы, получилось, но что делать дальше не пойму. Подскажите пожалуйста или порекомендуйте какие-нибудь мувики, в интернете ничего дельного по данной теме не нашел.

Java-конференция для разработчиков

⚠ Интересное мероприятие от наших партнеров

Если вы подписаны на нас больше пары месяцев, вы знаете, что мы любим мотивировать писать код: утром, днем, вечером, ночью, – неважно! Важно то, что сегодня мы ловим исключение!
Если вы находитесь на 20+ уровне, то в пятницу-субботу на этой неделе мы советуем вам погрузиться в мир Java – 22-23 апреля состоится главная в России Java-конференция для разработчиков JPoint 2016: javapoint.ru/

И если Java вам реально интересна, пропускать нельзя: 50 докладов и 1000 единомышленников – конференции открывают второе дыхание для занятий и помогают взглянуть на задачи с нового ракурса.

А если вы еще не достигли высшего мастерства – то в воскресенье 24 апреля рекомендуем посетить студенческий день JPoint 2016 SD. В программе — 2 Java-чемпиона, разработчик JVM, разработчик Hazelcast, обладатель Duke's Choice Award и другие гуру мирового уровня, а также стенды работодателей и стажировки: students.javapoint.ru/
  • ,

level18.lesson10.home07

/* Поиск данных внутри файла
Считать с консоли имя файла
Найти в файле информацию, которая относится к заданному id, и вывести ее на экран в виде, в котором она записана в файле.
Программа запускается с одним параметром: id (int)
Закрыть потоки. Не использовать try-with-resources

В файле данные разделены пробелом и хранятся в следующей последовательности:
id productName price quantity

где id — int
productName — название товара, может содержать пробелы, String
price — цена, double
quantity — количество, int

Информация по каждому товару хранится в отдельной строке
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        Integer argu = Integer.parseInt(args[0]); // Добавил такой костыль, т.к. в условии сказано что id - int
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        File file1 = new File(reader.readLine());
        BufferedReader readLineFromFile = new BufferedReader(new FileReader(file1));
        reader.close();
        String tmpStrFromFile;
        while ((tmpStrFromFile= readLineFromFile .readLine())!=null){
            if (tmpStrFromFile.charAt(0) == String.valueOf(argu).charAt(0) ){
                System.out.println(tmpStrFromFile);
            }
        }
        readLineFromFile .close();
    }
}

Что не так? Я не вижу просто, где тут несоответствие заданным условиям.

Это удивительно!

Привет всем!

Я хочу написать о том, что программирование это удивительно!

Сегодня на работе, еще не программистом, мне потребовалось обработать файл от 1000 (тысячи!) сотрудников, мне необходимо было собрать по ним по всем список ПО, которое стоит у них на компах.
В экселевском файле были огромные строки с большим количеством ПО, в этих строка были по разному разделены названия программ. И этих строк было 1200 (!).
Когда я впервые увидел файл, я, честно говоря, испугался. Такое количество тупой обработки, копипаст отсюда сюда. ЖЕСТЬ!

И тут руки сами потянулись к IDEA.
Я скопировал 1200 строк из опросника (экселевская колонка со списком программ) в текстовый документ.
Руки сами по себе накидали скрипт (спасибо за такое количество практики на курсе (!)).
Открыть файл
считать из файла
все поместить в TreeSet с новым компаратором, который не учитывает регистр
все вывести в другой файл.

В итоге 230 строчек, которые хоть и не были уникальны совершенно, но это 230 строчек АККУРАТНО уложенного и отсортированного списка программ вместо 1200 строк слипшегося, простите меня, плохо пахнущего вещества.
А так как все отсортировано, то похожие название уже рядом, и мне остается лишь немного доработать список вручную.
И все это за 1600 мс.
Меньше, чем за 2 секунды (!).
А я бы потратил на это перелопачивание руками часа 2 или 3, я бы возненавидел всех тех нерадивых сотрудников за такие списки, проклял бы тот день, когда я сел за баранку этого пылесоса.
А так 2 секунды.
Я ВОСХИЩЕН!

Спасибо всем тем, кто все это придумал. Множество умных людей все это создавали годами. Внутри Java огромные мощности. Фантастика!!!
Спасибо создателям курса за то, что научили этому всему.

Программирование РЕАЛЬНО облегчает жизнь людям.

p.s. буду дальше скрипт допиливать, чтобы сделать еще несколько отчетов по по этому ( а дальше еще будет) опроснику.
p.p.s. хочу для этой цели, если пойдет, освоить Apache Lucene, потому что есть еще одна задачка по поиску этих названий в базе. Поэтому, если кто захочет составить компанию, то с радостью поизучаю эту технологие в компании.
Также было бы здорово поработать с наставником.
  • ,

Вопрос по добавлению элементов в множество Set

Здравствуйте!

Недавно писал программу решения одной задачи в java, в ней в цикле шел перебор возможных решений. Решение представляет собой массив известной длины. Создал множество таких массивов solutions, в которое в цикле добавлял подходящие решения (они были в массиве sol):

solutions.add(sol);

Первое найденное решение добавлялось, а вот последующие уже нет. Первая мысль — решение повторяется, но нет, они все оригинальные… Решения стали добавляется после добавления процедуры clone():

solutions.add(sol.clone());

Почему первый вариант команды не добавлял элементы, а второй — добавлял?
  • ,

Найти IT Санкт-Петербург!

Жаварашовцы из Питера, те кто смог попасть на форум, обращаюсь к вам)))
Давайте MeetUp-немся перед началом event-a.
Узнаем, что, как и каким образом смог или нее смог добиться успеха.
Кто как не мы можем изменить этот мир!

Пожалуй оставлю свой Telegram: @vodka_balalayka. Пишите и будете отвеченными)
Обязательно отписывайтесь в комментариях.

Регистрируйтесь на сайте.

Коротко о сабже:
  • ,

+1 Java developer

Добрый вечер всем ученикам JavaRush, которые проводят уйму времени за решением задач, проклиная ненавистный popup «Программа не прошла тестирование». Придя в очередной раз с работы, решил написать все-таки свою историю, которая уверен до боли похожа на многие другие истории учеников.

На данный момент я уже полтора года работаю Java программистом в одной из киевских компаний. Занимаемся довольно серьезными и интересными вещами.

Начиналось все скорее всего так-же, как и у многих других студентов 5-6 курса, которые начинают уже задумываться что его делать после окончания. Когда приходит осознание того, что та работа, которой занимался со второго курса, особо таких перспектив на которые рассчитываешь, не имеет. И приходит понимание того, что кроме программирования, в универе другие предметы тебя так не цепляли.

JavaRush действительно в тот момент была находкой. С первых же лекций пришло понял то, что мой преподаватель по C++ в универе просто сволочь, что не умеет показать все прелести профессии программиста и процесса собственноручного создания программы. С каждой лекцией это убеждение становилось все больше и больше. И когда за день решаешь такое-же количество задач, которые нужно решить за пол года на лабораторных работах, приходит мысль о том, что КПИ дает очень важное, но к сожалению единственное умение — учиться.

И это честно говоря давало еще больше мотивации учиться самому и постепенно забивать на универ (за что кстати чуть не выгнали с магистратуры, но даже если б и выгнали, особо не жалел бы). Настолько бесполезным тогда казался универ, что было ощущение что там просто напросто тратишь свое драгоценное время, за которое мог бы пройти половину уровня и получить кучу реального практического опыта, о котором в универе думать не приходится.

Поэтому главным на том этапе было решить как можно больше задач. Когда был на уровне 19-20, ребята сделали реальный проект «Рейтинги». Было безумно приятно увидеть что делают люди на несколько уровней выше тебя, с которыми часто переписываешься и консультируешься на info. И конечно же сразу захотелось войти в ТОП по решенным задачам.

После 27 уровня задачи почти закончились. Выхода было два — идти на реальный проект JavaRush, либо бороться за интернатуру в одной из ИТ компаний Украины. После нескольких собеседований и тестирований, подготовка к которым была целыми днями без выходных, посчастливилось попасть в одну их них. На английский тогда кстати сделал очень большой упор, целыми днями сидел разбирал типичные разговоры на собеседованиях по английски.

И только после интернатуры, когда получил минимальный практический опыт с Git, Spring, Spring MVC, Hibernate, REST, JPA, JSP, MySQL, TomCat, jUnit, Spring Testing, была возможность пытаться на позиции Java Junior Programmer.

Несколько месяцев назад получил рассылку от JavaRush с вопросами. Одним из них был — «Если бы вы знали о JavaRush в самом начале обучения то, что знаете сейчас, сколько бы вы были готовы заплатить?». Ответ был $500, хотя в свое время ушло около $150. И не потому что знаю о примерных зарплатах в этой сфере. Дело скорее в человеческой жадности, если ты заплатил за это не малые деньги, то тебя жаба задавит если весь день ты ничего не учил. А мотивация это по моему самая главная движущая сила в обучении.

Именно поэтому и захотелось написать историю — как мотивацию учиться для всех тех, кто готов экран разбить когда видит очередное мать его «Программа не прошла тестирование».

Спасибо что дочитали до конца!

Автор: https://vk.com/id8743837
  • ,

Побайтовая работа с файлами

Special for Spiker

Начнем'c.
В 18 уровне начались первые задачи побайтного чтения файлов:
Прочитать файл, далее найти минимальные/максимальные байты или вывести в упорядоченном виде и т.п.

Народ тут весьма ушлый. Знают про коллекции и про то, что они могут сортировать, вставлять.
Коллекции — мощный механизм. И многие не применяли их вообще до JavaRush-а.
Оно, конечно, похвально изучать их и пытаться приткнуть куда не попадя.

И так. Возьмем задачу, которой нет в заданиях (чтобы не было спойлеров при решении), но есть сильно похожие:

Ввести с консоли имя файла
Считать все байты из файла.
Не учитывая повторений — отсортировать их по байт-коду в убывающем порядке.
Вывести на экран
Закрыть поток ввода-вывода

Пример байт входного файла
44 83 44

Пример вывода
83 44


Мы дополнительно завели переменные startTime и finishTime — чтобы засечь время выполнения программы.
Для вычисления использовал i3-3GHz/8Gb RAM/HDD WD Blue-1Tb/Win7-64/jdk-8u73-windows-x64

(примеры программ в вариантах 1-2 взяты из форума info.javarush, они чуть модифицированы только для сортировки в возрастающем порядке — то есть они РЕАЛЬНЫЕ!!)

Решаем в лоб:
// Вариант 1. Загоняем в коллекцию и сортируем используя ее метод Collections.sort 
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());
        long startTime = System.currentTimeMillis();
        
        ArrayList<Integer> listData = new ArrayList<Integer>();
        while (inputStream.available() > 0) listData.add(inputStream.read());
        inputStream.close();
        ArrayList<Integer> result = new ArrayList<Integer>(new HashSet<Integer>(listData));
        Collections.sort(result);

        while (!result.isEmpty()) {
            System.out.print(result.get(result.size()-1) + " ");
            result.remove(result.get(result.size()-1));
        }

        long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

Решает все замечательно! Тест (если бы был — прошелся бы на ура).
Но в жизни мало файлов содержащих только строчку «Мама мыла раму».
Давайте скормим нашей программе файл в 46Мб (по нынешним меркам вроде и не особо много).
Что такое, программа выполняется 220 секунд.
Попытка скормить с вечера 1Gb файл (размер MPEG4 фильма не в самом лучшем качестве) не увенчалась успехом.
Программа утром все еще читала — а мне идти на работу уже.

В чем проблема? Наверное в использовании
ArrayList<Integer>
у которого внутри 1 миллиард элементов. Каждый элемент его занимает 16 байт минимум (Заголовок: 8 байт + Поле int: 4 байта + Выравнивание для кратности 8: 4 байта). Итого мы добровольно загоняем в память 16 Gb данных при размере оперативы в 8.

Будем делать лучше. Нырнем в коллекции глубже. И ура, нашлось то, что нам нужно.

Встречаем TreeSet

Это множество:
-не допускает хранение двух одинаковых элементов (а значит мы будем хранить в памяти все 255 элементов, вместо миллиарда!)
-при манипуляциях со своими элементами автоматом упорядочивает (само сортирует — вот он, верх совершенства!)

Получаем:
// Вариант 2. Загоняем в ТreeSet который сам сортирует (лютый win!)
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        byte[] arrBytes = new byte[256];
        long startTime = System.currentTimeMillis();

        SortedSet<Integer> list = new TreeSet<Integer>();
        while(inputStream.available()>0) list.add(inputStream.read());
        inputStream.close();

        while (!list.isEmpty())        {
            System.out.print(list.last() + " ");
            list.remove(list.last());
        }

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}


Имеем на выходе:
46Мб файл 176 секунд.
1Gb файл — 3 часа 5 минут.
Прогресс на лицо. Мы смогли «дождаться» результатов, да и 46Мб файл заметно быстрее обрабатывается.

Идем дальше. Давайте попытаемся отказаться от коллекций (это будет для некоторых мучительно больно). Будем использовать простые массивы (это так примитивно).
Заметим одну важную вещь. Кол-во встречающихся байт можно загнать в массив длиной 256.
Так просто будем увеличивать на единицу соответствующий считанному байту элемент массива.

Массив — побайтно

// Вариант 3. Считываем массив побайтно.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        while (inputStream.available() > 0) arrBytes[inputStream.read()]++;

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

			long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}


Имеем на выходе:
46Мб файл 158 секунд.
1Gb файл — 2 часа 55 минут.
Опять улучшение, но небольшое. И мы сделали все простыми инструментами. Не использовали микроскоп для забивания гвоздей.

Теперь лирическое отступление.
Вспомним устройство компьютера.
Память ОЗУ (DRAM) где обычно выполняется программа и хранятся переменные имеет высокую скорость доступа, но небольшой размер.
Память на жестком/flash диске (HDD или Flash-накопители) где обычно хранятся файлы, наоборот имеет низкую скорость доступа, но большой размер.
Так что когда мы побайтно читаем 1Gb файл (то есть миллиард раз обращаемся к HDD) — мы тратим много времени на работу с низкоскоростным устройством
(по песчинке перекладываем песок с кузова КамАЗа в песочницу).

Попробуем еще улучшить.

Вывалим сразу ВЕСЬ КамАЗ с песком за один раз!

// Вариант 4. Считываем массив сразу целиком за раз в память.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        byte fileImage[]=new byte[inputStream.available()];
        long fileSize=fileImage.length;
        inputStream.read(fileImage);
        for (int i = 0; i <fileSize ; i++) arrBytes[fileImage[i] & 0b11111111]++;

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

небольшое, но опять таки важное отступление
Заметим:
1. индекс у arrBytes определен в пределах 0..255,
2. fileImage — массив байт, элементы которого имеют значение -128..127
Поэтому для подсчета байт будем использовать конструкцию
arrBytes[fileImage[i] & 0b11111111]++;

которая банально сбросит бит знака и вернет нам значение в диапазоне 0..255

И так, результаты:
46Мб файл 0.13 секунд (меньше секунды).
1Gb файл — 9 секунд.
Мы сделали это! Мы невероятно круты! Ускорились с 3 часов до 9 секунд.

Все, можно откинуться в кресле и попить чайку. А теперь еще один эксперимент —
попробуем файл в 32 Gb (например, HD фильм). Получим в результате треск
работающего HDD с вываливанием программы в Windows. КамАЗ вывалив кузов с песком сломал песочницу!

Что будем делать? Вспомним еще один факт. Файлы в ОС хранятся обычно порциями (кластерами) по 2-64Кб
(зависит от типа файловой системы, настроек и т.п.). Будем считывать порциями, для примера в 64000 байт.
Попытаемся разгрузить КамАЗ экскаватором достаточно большими порциями:

Используем буфер.
// Вариант 5. Считываем массив кусками.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        int  bufferSize = 64000;
        byte buffer[]   = new byte[64000];

        while (inputStream.available() > 0) {
            if (inputStream.available() < 64000) bufferSize = inputStream.available();
            inputStream.read(buffer, 0, bufferSize );
            for (int i = 0; i <bufferSize ; i++) arrBytes[ buffer[i] & 0b11111111 ]++;
        }

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

В итоге получили:
46Мб файл 0.08 секунд (меньше секунды).
1Gb файл — 0.9 секунд(меньше секунды).
32Gb файл — 31 секунда.

Заметим для 1 Gb файла мы улучшили производительность с нескольких часов до долей секунд!!!

На этом скромном факте закончим эксперимент и улучшение начального кода. Мы достигли прогресса во многом — нас радуют новые показатели расхода памяти и времени работы. Также мы не подтягиваем в данном случае бесполезные коллекции из стандартной библиотеки.

P.S. Кто-то скажет пример надуманный и т.п. Но полно похожих задач — проанализировать огромный объем элементов, имеющих конечное число состояний.
Например изображения (RGB — обычно хранятся в 24 байтах, в нашем случае long[] arrRGB = new long[256*256*256] занял бы в памяти всего 64Мб),
музыка (амплитуда обычно оцифровывается в 16 или 24 бита) или дискретные показатели датчиков и т.п.
  • ,

Выход из бесконечного цикла

Здравствуйте, дамы и господа!
Помогите, пожалуйста, решить проблему — необходимо выйти из бесконечного цикла с помощью нажатия клавиши (напр. ESC).

Вот мой код:

package likearobot;

import java.awt.Robot;
import java.awt.event.KeyEvent;

import java.awt.event.*;

public class LikeARobot {

    public static void main(String[] args) {
     KeyEvent e;
  Robot bot = null;
  try {
   bot = new Robot();
  } catch (Exception failed) {
   System.err.println("Failed instantiating Robot: " + failed);
  }
  int mask = InputEvent.BUTTON1_DOWN_MASK;

            

          //Открываем окно браузера
          bot.delay(1000);
          bot.mouseMove(140, 1190);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          
          
          bot.delay(2000);
          
          
          for ( ; ; )  
          {
           int picture = 300;
           int pictureTwo = 370;
          for (int i = 0; i < 2; i++)   
     
               {
         
          for (int j = 0; j < 12; j++)
          {
          //Открываем 1-ю картинку
          bot.mouseMove(picture, pictureTwo);
          picture = picture + 130;
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          
          
          bot.delay(2000);
          
          //Разворачиваем окно
          bot.mouseMove(1360, 309);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          
          
          bot.delay(2000);
          
          //Cтавим лайк
          bot.mouseMove(1130, 863);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          bot.delay(100);
          bot.mouseMove(1128, 815);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          bot.mouseMove(1168, 867);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          bot.mouseMove(1072, 867);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          bot.mouseMove(1128, 736);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);
          
          //Закрываем окно
          bot.delay(2000);
          bot.mouseMove(1895, 7);
          bot.mousePress(InputEvent.BUTTON1_MASK);
          bot.mouseRelease(InputEvent.BUTTON1_MASK);

          bot.delay(2000);
          }
          picture = 300;
          
          
          bot.delay(2000);
          bot.keyPress(KeyEvent.VK_F5);
          bot.delay(2000);
          
          }
          bot.delay(2000);
          bot.keyPress(KeyEvent.VK_F5);
          bot.delay(2000);
    
          
          }
          
          
          
          }
    



    }   
 
    


Я кажется нашел решение, но не смог его применить:

public void keyPressed(KeyEvent e) {}
 
    public void keyReleased(KeyEvent e) {
      if (e.getKeyChar() == KeyEvent.VK_ENTER) {
           System.exit(0);
      }
    }
 
    public void keyTyped(KeyEvent e) {}


Помогите, пожалуйста дополнить мой код, чтобы решить эту проблему.

Заранее всем спасибо!

Junior с 3 попыток

История моего обучения почти на 99% повторяет все ранее изложенные мемуары, постараюсь коротко.
Я учился в университете по специальности, которая подразумевает под собой IT-направление, но, увы, что касалось программирования, дальше «Hello World» дело не двигалось. Менялись языки, вместе с ними менялись преподаватели, а толку было мало.

Появлялись первые мысли: «А что же дальше?»

Началось все стандартно: товарищ показал ресурс с классными задачами и системой оценки этих задач, как вы уже догадались, это был тот самый JavaRush! Было это в 2014 году.
10 Уровней пролетели как секунда, нашлись деньги, появилась подписка. Следующие уровни шли тяжелее, так как затрагивали те области, по которым не ступал мой разум… Осилив n уровней после приобретения подписки уверенность подскочила до небес и толкнула меня создать резюме на небезызвестном сайте вакансий. В течение недели даже нашлась вакансия, под которую подпадали мои навыки программиста.
Первое собеседование прошло ужасно, и это, кстати, очень важный момент, в который нельзя опускать руки. Это собеседование дало мне пинок мотивации и следующие 2 месяца я занимался ежедневно по 6-8 часов. Но во мне таился страх завала следующего собеседования, и так и не дойдя до такового я потерял мотивацию, плюс добавились обстоятельства, которые забрали все свободное время, а подписка осталась пылиться…

Вторая попытка началась с того же вопроса: «А что же дальше?»

Тот, кто придумал фразу «повторение — мать учения» был чертовски прав! Вторая попытка шла в разы лучше первой, усвоенные знания хорошо закрепились и структурировались в сером веществе. Еще 2 или 3 месяца прошли в напряженном выкраивании времени для решения задач и чтения лекций, но подкралось одно очень суровое обстоятельство, имя которому — Диплом! Вторая попытка была похоронена вместе с первой, даже не добравшись до заветного собеседования…

Третья попытка началась с тревожного вопроса после защиты диплома: «И что теперь?»

Для третьей попытки требовалась новая тактика. Взяв пачку книг и видео курсов, я плотно уселся за занятия на ежедневной основе и уже через пару недель поднял все старые воспоминания даже подкрепив их новыми. Третья попытка дала мне возможность осмыслить почти каждый символ, литерал и строчку, используемые в коде. Через месяц после старта третьей попытки, я начал искать собеседования, но набор Junior'ов был очень скудный, а количество претендентов на одно место порой достигало 70 человек.

И наконец, в декабре 2015, после успешного выполнения тестового задания и прохождения собеседования в трудовой книжке появилась запись «младший программист». Сейчас заканчивается мой испытательный срок и вероятность трудоустройства на постоянной основе стремится к 100%.

Пожелания


Ребята, не стремитесь к космическому количеству решенных задач. Не решайте задачи для того, чтобы решить задачи! Вникайте в суть, задавайте вопросы, сомневайтесь. Смотрите шире. Да, JAVA очень нужна, но помимо JAVA нужно много знаний. Читайте про сети, web технологии, шаблоны проектирования и многое многое другое.

Традиционный список того, что нужно знать


  1. Основы
    Без основ никуда, если пару раз прочитать устройство HashMap, то скорее всего уже никогда не забудешь. В основы входят String, Collections API, Threads, I/O.Threads, I/O.
  2. Debug
    Обязательная вещь в больших Enterprise проектах.
  3. ООП
    Очень классно порешать тесты на QUIZFUL
  4. Servlets
    Так как Java — это всякого рода web и Enterprise, то с 50% сервлеты вам пригодятся.
  5. SQL
    Тут без комментариев.
  6. Spring и Hibernate
    Связка, которая мне сначала не пригодилась, но с которой постоянно приходится иметь дело, поэтому MUST HAVE!

P.S. Насчет работы. Верьте рассказам людей про то, что это лучшая работа в мире.
P.S.S. Спасибо JavaRush за интересные задачи, и огромное спасибо hubert
  • ,

Оформление кода

Одну из задач (которая была решена и принята сервером) я реализовал в виде кода (забил * и X-ми чтобы не спойлерить).

/* xxx
1. Считывать строки(параметры) с консоли, пока пользователь не введет пустую строку(Enter).
2. Каждый параметр соответствует имени ***.
Для каждого параметра:
3. Создать объект *** класса ***, который равен *** из getX(String параметр).
4. Вывести на экран toString().
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        //Add your code here
        List<String> al= new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while(!"".equals(str = reader.readLine())) al.add(str);
        for (int i = 0; i <al.size(); i++) System.out.println(XFactory.getX(al.get(i)).toString());
    }
...

Зашедший в гости полузнакомый раскритиковал, что так не пишут (это тебе не C и т.п.).
Не подскажете в чем я не прав (есть какие нормы и общепринятые стандарты)?
Или использование в одной строчке нескольких конструкций (оно вообще, без промежуточных присваиваний временным переменным, может привести в каких-либо ситуациях к каким-либо возможным последствиям?) — дурной тон?
Основные переменные (al, reader, str) объявлены до их использования (pascal-стиль), так как мне удобнее, всегда знаешь где можешь найти описание переменной с возможным комментарием.
Вспомогательные переменные объявлены в нужной зоне видимости (как переменная цикла i).
Idea не ругается, правда предлагает 2 опции:
Split into declaration and assigment (таки разделить объявление и присваивание) и заключить некоторые участки в блок try.

Как бы Вы правильнее написали код?

Что не так?
Для такой задачи не стоит комментировать каждую строчку.