Ответы пользователя по тегу Java
  • Какие параметры передать в format в JAVA?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Кнопки "сделать хорошо" в Java нет (ну, иногда есть, но не в этот раз)
    Я вижу следующий путь:
    - разбиваешь исходную строку на слова, помещая их в массив (см. методы класса String);
    - создаёшь новую строку (лучше StringBuilder);
    - идёшь по массиву, добавляя слова в новую строку, подсчитывая кол-во добавленных символов;
    - если новое слово не помещается, вставляешь "перенос строки", обнуляешь счётчик и продолжаешь добавлять слова;
    Ответ написан
  • Как определить три последующие пустые строки в коде JAVA?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    У Row есть метод getLastCellNum(), который вернёт -1 если в данной строке нет созданных ячеек, т.е. он пустой. Можно пройтись по строкам и найти место где 3 раза подряд этот метод возвращает -1.
    Но это годится только если лист создавался кодом. Если это "ручной" файл, то в ячейках м.б. пробелы, бордюры и что-нить ещё, поэтому критерий "пустой" надо будет определять как-то иначе.
    Ответ написан
  • Как передать пустое значение в массив?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Что-то ты навертел :) По-моему, так понятнее:
    final List<String[]> splitNames = new ArrayList<>();
        
    for (int i = 0; i < setFullNameList.size(); i++) {
      String[] splitFullName = {"", "", "none"};
      String[] temp = setFullNameList.get(i).split(" ");
    
      if (temp.length < 2) continue;    // некорректный ввод, переходим к следующему
    
      splitFullName[0] = temp[0];
      splitFullName[1] = temp[1];
      if (temp.length == 3) splitFullName[2] = temp[2];
    
      splitNames.add(splitFullName);    // сохраняем массив splitFullName
    }
    Ответ написан
    Комментировать
  • Как с generics получить объект нужного типа?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, выкладываю два варианта решения: одно, которое мы обсуждали с Dmitry Roo и второе, подсмотренное на SOF. Оба рабочие. Мне больше нравится второе (с Supplier<>), оно компактнее и не надо городить свою фабрику.

    import lombok.Getter;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Supplier;
    
    public class Test {
    
      public static void main(String[] args) {
    
        HandleB handleB = new HandleB();
        handleB.print();
    
        HandleC handleC = new HandleC();
        handleC.print();
    
      }
    }
    
    // ТИПЫ
    @Getter
    abstract class A {
      private String a = "aaa";
    }
    
    @Getter
    class B extends A {
      private String b = "bbb";
    }
    
    @Getter
    class C extends A {
      private String c = "ccc";
    }
    
    class MyFactory{
      private final String type;
    
      public MyFactory(String type) {
        this.type = type;
      }
    
      public A getObject(){
        return switch (type){
          case "B" -> new B();
          case "C" -> new C();
          default -> throw new IllegalStateException("Unexpected value: " + type);
        };
      }
    
    }
    
    // КЛАССЫ для работы с типами
    class HandleB {
      Commons<B> commons = new Commons<>("B");
    
      B instanceB = commons.getObject();
      List<B> list = commons.getList();
    
      void print(){
        System.out.println(instanceB.getB());
      }
    
    }
    
    class HandleC {
      Commons2<C> commons = new Commons2<>(C::new);
    
      C instanceC = commons.getObject();
      List<C> list = commons.getList();
    
      void print(){
        System.out.println(instanceC.getC());
      }
    
    }
    
    // КЛАСС с шаблонным кодом
    
    // вариант с фабрикой
    class Commons<T extends A> {
    
      MyFactory factory;
    
      public Commons(String type) {
        this.factory = new MyFactory(type);
      }
    
      List<T> getList() {
        List<T> list = new ArrayList<>();
    
        for (int i = 0; i < 3; i++) {
          T item = getObject();
          list.add(item);
        }
    
        return list;
      }
    
      T getObject() {
        return (T) factory.getObject();
      }
    
    }
    
    // вариант с Supplier<>
    // https://stackoverflow.com/questions/299998/instantiating-object-of-type-parameter
    class Commons2<T extends A> {
    
      private final Supplier<T> supplier;
    
      Commons2(Supplier<T> supplier) {
        this.supplier = supplier;
      }
    
      List<T> getList() {
        List<T> list = new ArrayList<>();
    
        for (int i = 0; i < 3; i++) {
          T item = getObject();
          list.add(item);
        }
    
        return list;
      }
    
      T getObject() {
        return supplier.get();
      }
      
    }


    Осталось понять как это знание прикрутить к приложению на Spring Boot.
    Как бы, логично Commons оформить аннотацией Service, но компоненты в Spring по умолчанию являются Singletone, а мне надо чтобы для каждого случая использования Commons "подключался" свой Supplier.
    1. Можно сделать Commons не Singletone, a Prototype и в каждом экземпляре инициализировать свой Supplier.
    2. Можно оставить Singletone, а в каждый метод где надо создавать объекты передавать нужный Supplier (выглядит несколько громоздко).
    3. Можно не вводить Commons в контекст Spring (не помечать его аннотацией, а оставить обычным классом) и использовать обычным Java-способом - экземляр, инициализация, использование. Тут штука в том что помимо Supplier в Commons будут и другие зависимости, которые в случае со Spring внедряются самим спрингом и их достаточно просто указать. Без спринга их надо будет внедрять руками. Как бы не проблема, но зачем нам лишняя писанина? :)

    В общем, пока думаю как сделать лучше. Если есть типовой способ - подскажите :)
    Ответ написан
    Комментировать
  • Как исправить Exception in thread "main" java.util.NoSuchElementException?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    У тебя на разных данных разные ошибки :)
    Например, на 1, 2, 2, 2, 3 всё нормально.
    А на 1, 2, 3 будет ошибка в методе removeItem() т.к. ты передаёшь туда List нулевой длины и пытаешься получить его элемент.
    Ответ написан
    Комментировать
  • Как быстро нарисовать график?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Запрос java библиотека для построения графиков даёт в основном ссылки на библиотеку JFreeChart. Если это не совсем то что нужно, там же есть видео "JavaFX | Как построить графики функций?". Как подход - можно использовать, наверно и в Swing.
    Ответ написан
    Комментировать
  • Spring Boot Data JPA, как добавить логику при чтении объекта из базы?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, решил добавлением дополнительного сервисного класса, который берёт объекты из репозитория и преобразует как надо, а основная программа уже получает готовые объекты из него. Что есть правильно ибо преобразование - это уже бизнес-логика и не надо её мешать с DAO. Самое смищное что это и есть Спринг-Путь и это описано во всех учебниках. А я чёт затупил :) Ну, ничего: понимание ведёт к запоминанию, в следующий раз буду умнее :)
    Ответ написан
    Комментировать
  • Spring Boot Security, как настроить русский логин?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Решил проблему переводом конфига с application.properties на application.yml. Так кодировка человечья :)
    Ответ написан
    Комментировать
  • Spring и Firebird: как исправить предупреждения SQLState: null и not support non-zero timeouts?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Тэкс... С первым вопросом разобрался, оставлю здесь, вдруг кому пригодится. Решил понижением версии JDBC-драйвера до 2.2.15 (прописыванием соответствующей строки в pom.xml). Я так понял - старому серверу СУБД - старый драйвер :) Кстати, jar для java-1.8 нормально (по крайней мере пока) работает под java-17.

    Второй вопрос пока без ответа, там трюк с подсовыванием старого драйвера не сработал.....
    Ответ написан
    Комментировать
  • Какие лучшие курсы java 2021?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Для самых маленьких я бы посоветовал эти (бесплатные):
    https://stepik.org/course/6858
    https://stepik.org/course/6859
    https://stepik.org/course/6864
    https://stepik.org/course/6860
    Проходить именно в таком порядке. Короткая теория и масса задач - то что надо. На английском, но язык там очень простой. Проходить можно (нужно!) прямо в IDE Intellij IDEA.

    javarush.ru хорош, но платный, я бы его советовал после того как осилишь те,на степике - и дело пойдёт гораздо быстрее, и точно будешь понимать за что платишь.
    Ответ написан
    Комментировать
  • Многоразрядный счётчик из цифр по любому основанию (Java), как сделать?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, от идеи полного перебора пришлось отказаться - считает слишком долго. Пробовал и с рекурсией, и с представлением BigInteger по основанию N (штатным и самодельным) - не дождаться :)

    Основную задачу решаю так. Допустим, N = 5. Тогда "максимальная" комбинация будет:
    0, 1, 2, 3, 4
    Все остальные будут получаться из неё выкидыванием элементов.
    Сначала выкидываем по одному, потом по два и т.д. Т.е. мне надо перебрать не сами элементы, а их позиции. Я сделал что-то вроде двоичной маски, в которой "1" - оставляем элемент, "0" - выкидываем. Например:

    0, 1, 2, 3, 4 - исходная комбинация
    0, 1, 0, 1, 0 - маска

    -, 1, -, 3, -> 1, 3 - результат

    Осталось пройти по всем вариантам маски, а это просто инкремент целого - и все комбинации получены! Тоже небыстро, но гораздо быстрее полного перебора! Если кто-то знает как ещё можно ускорить - поделитесь :)
    И да, собрать все комбинации в массив - тоже дохлая затея: память кончается очень быстро :) Приходится каждую комбинацию обрабатывать "на месте".

    котт:
    public class Part {
        public static void main(String[] args) {
            int numberOfThings = 41;
            long top = ((long) Math.pow(2, numberOfThings + 1));
            long bottom = ((long) Math.pow(2, numberOfThings)) + 1;
    
            int[] things = new int[numberOfThings];
            for (int i = 0; i < numberOfThings; i++) {
                things[i] = i;
            }
    
            while (bottom != top) {
                char[] mask = Long.toBinaryString(bottom++).toCharArray();
    
                List<Integer> comb = new ArrayList<>();
                for (int i = 0; i < numberOfThings; i++) {
                    if (mask[i + 1] == '1') comb.add(things[i]);
                }
    
                // Обработка комбинации
                System.out.println(comb);
            }
    
        }
    }
    Ответ написан
    Комментировать