• Стоит ли полностью переходить на последнии версии JAVA (9, 10, 11)?

    @MaxLich
    java developer
    Можно, но если будете работать, то есть некоторая немаленькая вероятность, что там будет старая версия джавы. Переход на новые версии языков, библиотек и программ в интерпрайзе происходит довольно медленно.
    Ответ написан
    Комментировать
  • Как установить задержку на выполнение KeyListener?

    @MaxLich
    java developer
    Так что сложного. После первого нажатия блокируешь (деактивируешь) кнопку, одновременно запускаешь тред, который через указанный промежуток времени выполнить нужное действие. Кроме того, вместе с этим запускаешь ещё один тред, который ждёт указанный промежуток времени, а потом активирует эту кнопку.
    Ответ написан
    Комментировать
  • Как джуну без профильного резюме составлять?

    @MaxLich
    java developer
    1. Наработать какие-то навыки и знания + проекты. Указать это в резюме.
    2. Кратко перечислить свой непрофильный опыт работы. Отметить проявленные и наработанные софтскиллы.
    3. Закончить какие-нибудь курсы по интересуемой сферы IT, получить какие-либо сертификаты и прочее. Указать в резюме.
    4. Если хороший уровень английского (или немецкого, французского (нужного подчеркнуть)), указать это в резюме. (Порой берут со слабыми хардскиллами, но с хорошим инглишом.)
    Ответ написан
    2 комментария
  • Где находятся IT-центры в США?

    @MaxLich
    java developer
    Ответ написан
    Комментировать
  • Где взять практику ,задания по Python с решениями?

    @MaxLich
    java developer
    Сами задания можно решать на www.codingbat.com. Но там чисто задания, ответы дают в редких случаях. Но потренироваться можно
    Ответ написан
    Комментировать
  • Первая работа в IT. Стоит ли принимать такое решение?

    @MaxLich
    java developer
    Я бы наверно согласился, но поработал бы там не больше полугода. Чисто опыта набраться. Да и на людей с опытом работодатель уже по-другому смотрит. На своей шкуре это понял. Пока у меня вообще не было опыта коммерческой разработки, я долго искал работу (3 месяца), рассылал резюме, и мне мало кто писал (вообще, даже в ответ на резюме). Но после полугода какого-никакого опыта (по-крайней мере на бумажке этот так), мне уже работодатели сами пишут, и причём довольно часто (раз в неделю точно, а то и чаще). И это учесть, что сейчас я сам не ищу работу, просто висит резюме на хедхантере. Поэтому это в любом случае будет полезно, но долго там задерживаться - вредно. (Заодно и деньги накопите для переезда в город-миллионник.)
    Хотя, если есть деньги на несколько месяцев житья в большом городе, и уже накопил достаточные знания и опыт, то можно пробовать перебираться в миллионик, и искать работу там. Джунам, конечно, сложно, тем более на андроиде, но в большой городе много фирм и много вакансий, поэтому за полгода точно что-то найдёте.
    Плюс ко всему, можете попробовать со своего города искать работу в городе миллионике (я в Питере-то часто проходил собеседование по скайпу, хотя тут один город, и можно встретиться и вживую, а уж если другой город, то скайп - самое оно). Если же назначат "живое" собеседование, то можете взять день и съездить.
    Вообще, до живого интервью ещё надо добраться. Обычно это происходит не сразу: пока твоё резюме найдут или обратят на него внимание, пока вышлют тестовое, пока ты его решишь, плюс если ещё будет скайп-собеседование с HR и/или техническим специалистом... Так что тут может месяц пройти.
    Ответ написан
    Комментировать
  • JAVA JDBC не удается получить одну запись из таблицы?

    @MaxLich
    java developer
    Если Вы действительно пытаетесь без вызова метода next() получить результат, то у Вас ничего не получится. Внутренний указатель ResultSet вначале стоит перед первой строкой. Так что в любом случает next() нужно вызывать.
    Ответ написан
    Комментировать
  • Есть ли толк в совместной разработке неопытным программистам?

    @MaxLich
    java developer
    Это будет полезный опыт командной работы, но без опытного товарища будет тяжело и плохо. Можно уйти не туда, да и развитие будет слабое. В идеале, бы ментора найти.
    Ответ написан
    Комментировать
  • Нужна ли вышка для веб-разработчика?

    @MaxLich
    java developer
    Если Вы только закончили школу, и думаете, что делать, то можно смело идти на вышку. Если Вы свитчер, то есть окончили вуз не по программированию, долго работали не программистом (а каким-нибудь менеджером или инженером), и сейчас решили перейти в программирование, то нет смысла тратить 4 или 6 лет (или сколько там сейчас в вузах) на обучение. В этом случае лучше закончить какие-то курсы, и всё остальное, что не дадут курсы - изучить самостоятельно.
    Ответ написан
    Комментировать
  • Почему не работает замена \n?

    @MaxLich
    java developer
    У вас реплейс вызывается у последней строки, то есть сначала выполняется такой код:
    "If-Modified-Since: Wed, 06 Jul 2016 07:58:20 GMT\n\n".replaceAll("\n", "E")

    "" - это объект типа String,
    replaceAll() - это его метод.
    Ваш код равносилен:
    MyClass myObj = new MyClass(); 
    System.out.println(myObj.replace().toString());
    Ответ написан
    Комментировать
  • Как на java сделать, генератор случайных букв и чисел?

    @MaxLich
    java developer
    Можно ещё завести массив или строку со всеми перечисленными буквами и цифрами. И уже случайным образом выбирать элемент этого массива или строки.
    Ответ написан
  • На каком уровне нужно знать java для андроид разработчика?

    @MaxLich
    java developer
    Насколько я понял, знание синтаксиса достаточно. Я бы начал изучать андроид с 20-го уровня. А дальше уже смотреть. Практически до конца там по сути нужные темы.
    Ответ написан
    Комментировать
  • Как узнать сложность (количество переходов) в поиске по хэш таблице?

    @MaxLich
    java developer
    В идеальном случае - О(1), в худшем - О(n). В чём проблема?
    Ответ написан
    Комментировать
  • Можно ли будет создавать крутые андроид приложения если пройти курс JavaRush?

    @MaxLich
    java developer
    Прошёл курсы на джавараш по джаве. Начинал по андроиду их переводы курса гугла. Но и то, и то не подходит для создания "крутых приложений" на андроид. Джава применяется в андроиде, но одной джавы недостаточно. А тот базовый курс, как я понял, даст только начальные знания. Так что пройти можно эти курсы, но их одних явно будет недостаточно.
    Ответ написан
    Комментировать
  • Хотите задать вопрос администрации Тостера?

    @MaxLich
    java developer
    Опросы предполагается добавить? Если да, то когда?
    Ответ написан
    2 комментария
  • Как эффективно сгруппировать строки?

    @MaxLich Автор вопроса
    java developer
    Нашёл одно решение. Алгоритм:
    1. храним результат в виде списка списков: [номер_группы -> [строки_группы]]
    2. используем вспомогательный список хэш-таблиц: [позиция_слова -> { слово -> номер_группы }] и вспомогательную хэш-таблицу для хранения какая группа в какую была влита
    3. каждое слово строки ищем в соответствующей (позиции слова в строке) хэш-таблице
      а) если слово есть, запоминаем номер группы (значение из хэш-таблицы), в которой оно найдено
      б) если слова нет, то добавляем его в список новых слов
    4. если строка (а точнее её слова) найдена в группах, то берём первую из "живых" (объяснение этого позже) групп, иначе создаём новую группу
    5. добавляем новые слова в соответствующие хэш-таблицы с номером найденной/созданной группы
    6. объединяем найденные группы в одну, выбранную ранее. Так как группы хранятся в виде списка строк, то просто объединяем списки строк в один у выбранной группы, а более ненужные группы отмечаем как "мёртвые" (присваиваем null, дабы не перемещать элементы внутри списка)
    7. добавляем строку в список строк группы


    Код метода поиска групп:
    code
    private static List<List<String>> findLineGroups(List<String> lines) {
            class NewLineElement {
                private String lineElement;
                private int columnNum;
    
                private NewLineElement(String lineElement, int columnNum) {
                    this.lineElement = lineElement;
                    this.columnNum = columnNum;
                }
            }
    
            if (lines == null)
                return Collections.emptyList();
    
            List<List<String>> linesGroups = new ArrayList<>(); //список групп, каждый элемент вида "номер группы - список строк группы"
            if (lines.size() < 2) {
                linesGroups.add(lines);
                return linesGroups;
            }
    
            List<Map<String, Integer>> columns = new ArrayList<>(); // список стобцов, каждый столбец - мапа с парами "элемент строки/столбца-номер группы"
            Map<Integer, Integer> unitedGroups = new HashMap<>(); //мэп с парами "номер некоторой группы - номер группы, с которой надо объединить данную"
            for (String line : lines) {
                String[] lineElements = line.split(";");
                TreeSet<Integer> groupsWithSameElems = new TreeSet<>(); //список групп, имеющих совпадающие элементы
                List<NewLineElement> newElements = new ArrayList<>(); //список элементов, которых нет в мапах столбцов
    
                for (int elmIndex = 0; elmIndex < lineElements.length; elmIndex++) {
                    String currLnElem = lineElements[elmIndex];
                    if (columns.size() == elmIndex)
                        columns.add(new HashMap<>());
                    if ("".equals(currLnElem.replaceAll("\"","").trim()))
                        continue;
    
                    Map<String, Integer> currCol = columns.get(elmIndex);
                    Integer elemGrNum = currCol.get(currLnElem);
                    if (elemGrNum != null) {
                        while (unitedGroups.containsKey(elemGrNum)) // если группа с таким номером объединена с другой,
                            elemGrNum = unitedGroups.get(elemGrNum); //то сохраняем номер группы, с которой была объединена данная
                        groupsWithSameElems.add(elemGrNum);
                    } else {
                        newElements.add(new NewLineElement(currLnElem, elmIndex));
                    }
                }
                int groupNumber;
                if (groupsWithSameElems.isEmpty()) {
                    linesGroups.add(new ArrayList<>());
                    groupNumber = linesGroups.size() - 1;
                } else {
                    groupNumber = groupsWithSameElems.first();
                }
                for (NewLineElement newLineElement : newElements) {
                    columns.get(newLineElement.columnNum).put(newLineElement.lineElement, groupNumber);
                }
                for (int matchedGrNum : groupsWithSameElems) { //перебираем все группы с таким же элементом
                    if (matchedGrNum != groupNumber) {
                        unitedGroups.put(matchedGrNum, groupNumber); //сохраняем инф-цию об объединённых группах
                        linesGroups.get(groupNumber).addAll(linesGroups.get(matchedGrNum)); //объединяем группы
                        linesGroups.set(matchedGrNum, null); //помечаем группу с текущим номер, как несуществующую
                    }
                }
                linesGroups.get(groupNumber).add(line);
            }
            linesGroups.removeAll(Collections.singleton(null)); //удаляем несуществующие группы
            return linesGroups;
        }
    Ответ написан
    Комментировать
  • Как эффективно разбить множество строковых значений на непересекающиеся группы?

    @MaxLich
    java developer
    Нашёл одно решение. Алгоритм:
    1. храним результат в виде списка списков: [номер_группы -> [строки_группы]]
    2. используем вспомогательный список хэш-таблиц: [позиция_слова -> { слово -> номер_группы }] и вспомогательную хэш-таблицу для хранения какая группа в какую была влита
    3. каждое слово строки ищем в соответствующей (позиции слова в строке) хэш-таблице
      а) если слово есть, запоминаем номер группы (значение из хэш-таблицы), в которой оно найдено
      б) если слова нет, то добавляем его в список новых слов
    4. если строка (а точнее её слова) найдена в группах, то берём первую из "живых" (объяснение этого позже) групп, иначе создаём новую группу
    5. добавляем новые слова в соответствующие хэш-таблицы с номером найденной/созданной группы
    6. объединяем найденные группы в одну, выбранную ранее. Так как группы хранятся в виде списка строк, то просто объединяем списки строк в один у выбранной группы, а более ненужные группы отмечаем как "мёртвые" (присваиваем null, дабы не перемещать элементы внутри списка)
    7. добавляем строку в список строк группы


    Код метода поиска групп:
    code
    private static List<List<String>> findLineGroups(List<String> lines) {
            class NewLineElement {
                private String lineElement;
                private int columnNum;
    
                private NewLineElement(String lineElement, int columnNum) {
                    this.lineElement = lineElement;
                    this.columnNum = columnNum;
                }
            }
    
            if (lines == null)
                return Collections.emptyList();
    
            List<List<String>> linesGroups = new ArrayList<>(); //список групп, каждый элемент вида "номер группы - список строк группы"
            if (lines.size() < 2) {
                linesGroups.add(lines);
                return linesGroups;
            }
    
            List<Map<String, Integer>> columns = new ArrayList<>(); // список стобцов, каждый столбец - мапа с парами "элемент строки/столбца-номер группы"
            Map<Integer, Integer> unitedGroups = new HashMap<>(); //мэп с парами "номер некоторой группы - номер группы, с которой надо объединить данную"
            for (String line : lines) {
                String[] lineElements = line.split(";");
                TreeSet<Integer> groupsWithSameElems = new TreeSet<>(); //список групп, имеющих совпадающие элементы
                List<NewLineElement> newElements = new ArrayList<>(); //список элементов, которых нет в мапах столбцов
    
                for (int elmIndex = 0; elmIndex < lineElements.length; elmIndex++) {
                    String currLnElem = lineElements[elmIndex];
                    if (columns.size() == elmIndex)
                        columns.add(new HashMap<>());
                    if ("".equals(currLnElem.replaceAll("\"","").trim()))
                        continue;
    
                    Map<String, Integer> currCol = columns.get(elmIndex);
                    Integer elemGrNum = currCol.get(currLnElem);
                    if (elemGrNum != null) {
                        while (unitedGroups.containsKey(elemGrNum)) // если группа с таким номером объединена с другой,
                            elemGrNum = unitedGroups.get(elemGrNum); //то сохраняем номер группы, с которой была объединена данная
                        groupsWithSameElems.add(elemGrNum);
                    } else {
                        newElements.add(new NewLineElement(currLnElem, elmIndex));
                    }
                }
                int groupNumber;
                if (groupsWithSameElems.isEmpty()) {
                    linesGroups.add(new ArrayList<>());
                    groupNumber = linesGroups.size() - 1;
                } else {
                    groupNumber = groupsWithSameElems.first();
                }
                for (NewLineElement newLineElement : newElements) {
                    columns.get(newLineElement.columnNum).put(newLineElement.lineElement, groupNumber);
                }
                for (int matchedGrNum : groupsWithSameElems) { //перебираем все группы с таким же элементом
                    if (matchedGrNum != groupNumber) {
                        unitedGroups.put(matchedGrNum, groupNumber); //сохраняем инф-цию об объединённых группах
                        linesGroups.get(groupNumber).addAll(linesGroups.get(matchedGrNum)); //объединяем группы
                        linesGroups.set(matchedGrNum, null); //помечаем группу с текущим номер, как несуществующую
                    }
                }
                linesGroups.get(groupNumber).add(line);
            }
            linesGroups.removeAll(Collections.singleton(null)); //удаляем несуществующие группы
            return linesGroups;
        }
    Ответ написан
    1 комментарий
  • Как влияет импорт библиотек из пакета на производительность и размер байт кода Java?

    @MaxLich
    java developer
    Никак не влияет. Это просто указание компилятору и JVM, где брать нужные классы.
    Ответ написан
    Комментировать
  • Нужно ли программисту, пищущему на языке высокого уровня, знать детали работы ЭВМ?

    @MaxLich
    java developer
    Моё мнение - знать это нужно, но если будете заниматься только ЯП высокого уровня, то нет необходимости глубоко в этом разбираться. В институте эти предметы всё равно даются на базовом уровне, так что в любом случае их надо хорошо изучить и сдать.
    Ответ написан
    Комментировать
  • Как добавить изображение на панель?

    @MaxLich
    java developer
    Хм, у меня сейчас в рабочем проекте такой код.
    Код создания метки для фото:
    JLabel photo = new JLabel();
                Icon icon = loadPhoto(editingRecord == null ? "" : editingRecord.getPhotoBase64());
                photo.setIcon(icon);


    Метод loadPhoto():
    private Icon loadPhoto(String base64String) {
            if (isBlank(base64String)) {
                return null;
            }
    
            byte[] bytes = DatatypeConverter.parseBase64Binary(base64String);
            ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
            try {
                BufferedImage original = ImageIO.read(bin);
    
                if (original == null || original.getHeight() == 0) {
                    return null;
                }
    
                double factor = 100.0 / original.getHeight();
    
                int newWidth = new Double(((double) original.getWidth()) * factor).intValue();
                int newHeight = 100;
    
                BufferedImage resized = new BufferedImage(newWidth, newHeight, original.getType());
                Graphics2D g = resized.createGraphics();
                g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g.drawImage(original, 0, 0, newWidth, newHeight, 0, 0, original.getWidth(),
                        original.getHeight(), null);
                g.dispose();
    
                return new ImageIcon(resized);
            } catch (Exception e) {
                logger.error(LogHelper.print("Can't load photo preview for employee", e));
                MessageDialog.showError(this,
                        Global.data().getString("ERROR_READING_EMPLOYEE_PHOTO"),
                        Global.data().getString("ERROR_TITLE"));
            }
    
            return null;
        }
    Ответ написан
    Комментировать