Ответы пользователя по тегу Java
  • Как парсить String?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Отвечу тут:
    Для преобразования к строке любого примитивного типа или объекта вызовите метод toString();
    proglang.su/java/strings-tostring
    Ответ написан
    Комментировать
  • Почему не находит CSRF Token при отправке multipart/form-data в Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Виден ли токен в исходном коде DOM внутри тега form?
    А при сабмите формы CSRF токен отправляется?

    Конфиги для multipartfile я прописываю в properties С проблемой почему null в CSRF при отправке формы не сталкиввлся.
    # File upload size
    spring.servlet.multipart.max-file-size=20MB
    spring.servlet.multipart.max-request-size=20MB
    spring.servlet.multipart.file-size-threshold=2KB
    # Uploads
    spring.servlet.multipart.enabled=true
    fl.upload_path=/home/phoenix/example.com/uploads
    Ответ написан
    Комментировать
  • Как написать необычный калькулятор на Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Зачем вам 2 экзамляра Scanner для делимого и делителя? Достаточно создать один экземляр класса и завести 2 переменные для делимого и делителя.

    Что касается реализации калькулятора, то тут все зависит от ваших возможностей и вашей фантазии:
    Вот, несколько враиантов реализации...
    1) Использование switch case. Пользователь вводит "Подели", вы при помощи указанной конструкции находите нужный арифметический оператор, далее просите пользователя ввести числа (делимое и делитель). Ну и выдаете ответ. Тогда нужно предусмотреть вариант, когда пользователь введет "левое" слово и на это выдавать некое информационное сообщение.
    2) Другой вариант, как например, можно принимать от пользователя целое предложение. String, а далее при помощи регулярного выражения получать нужную информацию (арифметический оператор словами, делимое и делитель). Тут понадобятся знания регулярных выражений (regExp)
    3) Другой вариант, например, чтобы исключить такие моменты, как "подели", "раздели" и т.д. получить корень слова сделав проверку при помощи метода contains("дел") , а далее согласно корню слова произвести нужное вычисление. Ну или взять библиотеку, которая работает с грамматикой.
    Что-то типа - wordnet.ru
    4) нейросети и т.д.

    Наверное, как-то так...
    Может быть есть более изящные способы решения вопроса)
    Ответ написан
    4 комментария
  • Как закончить программу "Максимальное значение"?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!

    Вот, ваш исходый код:
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            ArrayList array = new ArrayList<>();
            System.out.println("Введите числа");
            while (true) {
                int number = input.nextInt();
                array.add(number);
                if (number == 0) {
                    break;
                }
                int max = 0;
                
                for (int i = 0; i < array.length; i++) {
                    if (array.get(i) > max) {
                        max = array.get(i);
                    }
                }
    
            }
        }
    
    }


    Вы пытаетесь получить размер используя length, но при этом используете объект ArrayList. У ArrayList для получения размера нужно использовать size()
    Ошибка:
    i < array.length;
    Либо создавайте массив чисел, либо если используете ArrayList (списочный массив), то вызывайте метод size() для получения размера списка.

    Также обратите внимание, что вы пытаетесь сравнить числа находясь внутри цикла, но при этом до выполнения кода сравнения вы вводите ноль и выходите их массива.

    Добавил комментарии в код:
    if (number == 0) {
                    break; // вышли из цикла
                }
    
                // до сюда код не исполнится, так как выше break и вы вышли из цикла
                int max = 0;
                for (int i = 0; i < array.length; i++) {
                    if (array.get(i) > max) {
                        max = array.get(i);
                    }
                }


    А тут вам нужно передать параметризованный тип (желательно)
    До -
    ArrayList array = new ArrayList<>();
    После -
    ArrayList<Integer> array = new ArrayList<>();

    Что касается получения максимального значения числа, то почему бы вам не воспользоваться возможностями пакета Math ? В частности метод max() или например, метод max() в Collections.

    Вот, рабочий код:
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner input = new Scanner(System.in);
            ArrayList<Integer> array = new ArrayList<>();
            System.out.println("Введите числа");
    
            while (true) {
                int number = input.nextInt();
                array.add(number);
    
                if (number == 0) {
                    break;
                }
            }
    
            int maxValue = Collections.max(array);
            System.out.println("Максимальное число " + maxValue);
    
        }
    
    }


    Если вы хотите найти макс. значение самой итерируя по списку, то вот, другое решение
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner input = new Scanner(System.in);
            ArrayList<Integer> array = new ArrayList<>();
            System.out.println("Введите числа");
    
            while (true) {
                int number = input.nextInt();
                array.add(number);
    
                if (number == 0) {
                    break;
                }
            }
    
            /*int maxValue = Collections.max(array);
            System.out.println("Максимальное число " + maxValue);*/
    
            int maxValue = 0;
            for (int i : array) {
                if (array.get(i) > maxValue) {
                    maxValue = array.get(i);
                }
            }
            System.out.println("Максимальное число " + maxValue);
        }
    
    }
    Ответ написан
    Комментировать
  • Как сделать авторизацию в Android приложении?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Можно же реализовать JWT авторизацию (bearer token).
    А далее каждый раз при запуске вашего приложения вместо ввода логина и пароля отсылаете на сервер токен и авторизовываете пользователя. Сервер на чем у вас написан? Используется ли фреймворк?
    Вот, например, решение на Spring + Spring Security
    https://www.callicoder.com/spring-boot-spring-secu...
    https://habr.com/ru/post/278411/
    https://github.com/hantsy/springboot-jwt-sample
    https://auth0.com/blog/implementing-jwt-authentica...
    https://www.baeldung.com/spring-security-oauth-jwt
    Ответ написан
    3 комментария
  • Как решить данную ошибку компиляции?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Тут рекомендуют переименовать файл - https://stackoverflow.com/questions/23169333/error...

    Вот, другое решение:
    https://stackoverflow.com/questions/39428174/andro...

    android {
        ....
        aaptOptions {
            cruncherEnabled = false
        }
        ....
    }


    А вот, Google
    Ответ написан
  • Как вытащить символы кроме запятой и цифр в Java?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    public class Main {
    
        public static void main(String[] args) {
    
            String a = "100 ₽";
            String b = "$4,99";
            String c = "9,99 €";
            String d = "100 CA$";
    
            // Паттерн
            String regex = "\\p{Sc}";
            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    
            // передали переменную a, b, c или d в метод matcher()
            Matcher matcher = pattern.matcher(a);
    
            while (matcher.find()) {
                // Выведет ₽, $, €, $
                System.out.println(matcher.group());
            }
    
        }
    
    }

    https://howtodoinjava.com/regex/java-regex-match-a...
    Ответ написан
    5 комментариев
  • Как правильно работать с CopyOnWriteArrayList?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Допустим, есть web-страничка на которой пользователи делают действия. История действий записывается в переменную типа CopyOnWriteArrayList

    Не совсем вас понимаю, как именно история действий записывается в переменую CopyOnWriteArrayList? А самое главное - зачем?

    Может быть есть смысл сделать следующее:
    записывать историю действий в localStorage браузера пользователя (средствами JavaScript), а далее по исстечению определенного времени или по нажатию кнопки "Сохранить" или еще какого-либо другого триггера сохранить все в БД.
    Ответ написан
  • Как узнать на чем запущено android приложение, на телефоне или планшете?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Determine if the device is a smartphone or tablet?
    https://stackoverflow.com/questions/9279111/determ...

    Correctly detect Android device type
    https://stackoverflow.com/questions/40157799/corre...

    Google
    Ответ написан
    Комментировать
  • Отправка данных из Android приложения в БД MySQL?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Раз вы пишете на Java, то можно взять Spring Boot и поднять небольшое REST приложение на стороне сервера.
    Далее при помощи okhttp ищ android отправляете POST запрос с нужными данными на сервер.
    Сервер при помощи jackson или gson обрабатывает JSON, маппит их в DTO, а далее в модель и сохраняет в БД.
    Ответ написан
    Комментировать
  • Как в Java отнять от числа, чтобы результат сохранился и от этого результата отнять следующее число?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    А как сделать так, чтобы одно общее значение (бак 1000 мл) после вычерпывания 100 мл, возвращал новое значение и следующая кружка отнималась бы уже от нового значения?

    Так вы переменной, которая содержит информацию о баке, внутри цикла после вычерпывания (вычитания) присваивайте новое значение и все

    Примерно как-то так:
    public class Main {
    
        public static void main(String[] args) {
    
            int volume = 1000;
    
            Scanner scanner = new Scanner(System.in);
            System.out.println(
                    "Объем бака равен - 1000 мл. \n" +
                            "Введите значение 100 мл. или 200 мл."
            );
            while (volume >= 0) {
                int input = scanner.nextInt();
    
                if(input > volume) {
                    System.out.println("В баке нет такого объема воды!");
                    continue;
                } else if(input == 100) {
                    volume -= input;
                    System.out.println("Остаток в баке: " + volume);
                } else if (input == 200) {
                    volume -= input;
                    System.out.println("Остаток в баке: " + volume);
                } else {
                    System.out.println("Вы ввели недействительное значение!");
                }
    
                if(volume == 0) {
                    System.out.println("Вода в баке закончилась");
                    break;
                }
    
            }
    
        }
    
    }


    В первой ветке if проверяем есть ли такой объем воды в баке
    Во второй и в третьей ветках мы соответственно, вычитаем нужный объем из общего объема бака
    В четвертой ветке мы выводим сообщение, если введено значение отличное от 100 или 200.
    Ну и в самом конце если объем меньше 0, то выходим из цикла.
    Ответ написан
    7 комментариев
  • Как написать программу "Максимальное значение"?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Я и сам изучаю Java и хочу акцентировать ваше внимание на следующих пунктах:

    Во-первых,
    ArrayList<String> myList Вы создаете ArrayList с параметрированным типом данных String.

    Отсюда возможны слудующие проблемы в дальнейшем:

    1) Как убедиться, что пользователь введет именно число, а не слово. Если вы хотите использовать именно тип String, то стоит использовать также regexp и метод matches() и проверять на то, что пользователь ввел именно цифру или число.

    2) Как сравнить числа, если они являются переменными типа String?
    Разве, что нужно будет итерировать по списку и использовать Integer.parseInt(str) Ведь, сравнить строки вы не можете и вам придется привести строки к типу int.

    3) if(number == "!")
    Строки лучше сравнивать используя метод equals(). Вам не удается выйти из цикла именно из-за этого. используйте equals()

    Наверное, лучше сразу принимать int используя sc.nextInt(), а из цикла выходить другим способом. Например, нажатием кнопки, которую вы назначите на выход из цикла. Например, добавив event listener для кнопки Enter и по нажатию кнопки выходите из цикла. А далее итерировать по списку и сравнить данные и выдать макс. значение
    Ответ написан
    Комментировать
  • Как разрешить пользователю редактировать только собсвенные комментарии?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    У меня есть несколько идей по решению данной задачи. Какая из них корректная не скажу, но тем не менее решит ваши задачи.

    Итак,
    Для начала создадим controllerAdvice

    @RequiredArgsConstructor
    @ControllerAdvice
    public class GlobalControllerAdvice {
    private final UserServiceImpl userServiceImpl;
    
    @ModelAttribute("currentUser")
        public User getUserProfile(
                @AuthenticationPrincipal UserDetails currentUser
        ) {
            if (currentUser != null)
                return (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
            return null;
        }
    
    }


    Теперь, нам доступна переменная ${currentUser} (текущий авторизованный пользователь)

    Далее, допустим, что мы хотим на клиенте отобразить иконку редактирования по клику на которую пользователь сможет отредактировать комментарий.
    Когда вы в html (в шаблонизаторе) циклом выводите список комментариев, то просто сравните текущего авторизованного пользователя и автора каждого комментария. Если equals(), то показываем иконку редактирования, а если нет, то не показываем.

    Например, для thymeleaf
    <div class="comments" th:each="comment : ${comments}"> 
    <input th:if="${comment.author} eq ${currentUser}" type="button" value="Отредактировать комментарий"/>
    </div>

    Или вы можете вместо сравнения объектов сравнить их id и т.д.

    А если нужно проверить автора в методе контроллера, то получаем текущего пользователя:
    @GetMapping("/edit/{commentId}")
    public String editComment(
    @PathVariable("commentId") Long commentId,
    @AuthenticationPrincipal UserDetails currentUser,
    ) {
    User user = (User) userServiceImpl.findUserByEmail(currentUser.getUsername());
    /*
    Далее находим комментарий по его id. находим его автора и сравниваем с user.
    */
    
    }
    Ответ написан
    2 комментария
  • Почему не получается спарсить это значение через Jsoup?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Добрый день!
    1) То что вы видите в консоли браузера (при инспектировании элементы) и то что отображается в исходном коде ctrl + u разнятся.
    В исходном коде нет этих элементов, так как предположительно они добавляются в DOM динамически (средствами js). Вроде бы фреймворк react.
    Соответственно, спарсить при помози jsoup не получится.
    Смотрите в сторону
    selenium + jbrowserdriver - https://github.com/MachinePublishers/jBrowserDriver
    selenium + chrome || firefox
    Ответ написан
    1 комментарий
  • Как установить java на ubuntu?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    С учетом того, что вам Java нужна не для разработки и jre будет достаточно, то sdkman вам не понадобится.
    Однако, обратите внимание на следующее:
    1) установлена ли java
    2) корректно ли прописаны системные переменные

    Для начала:
    Набираем и узнаем версию
    java -version
    Если показывает версию, то все ок. А если нет, то значит у вас скорее всего java не установлена.
    Идем дальше (установка java):
    sudo apt update
    sudo apt install openjdk-11-jre


    Также иногда может быть установлена несколько jre и jdk.
    Наберите в консоли:
    sudo update-alternatives --config java

    В консоли вы увидите путь до директории java. Если их несколько, то копируем нужный путь, а далее:
    Открываем редактор:
    sudo nano /etc/environment
    Добавляем:
    JAVA_HOME="{путь, который скопировали, включая директорию bin}"

    Закрываем редактор и заново загружаем файл
    source /etc/environment

    Набираем в консоли:
    echo $JAVA_HOME
    Если путь отобразился, то все ок.

    Ссылка на источник - https://www.digitalocean.com/community/tutorials/h...
    Ответ написан
    2 комментария
  • Как работает данный код?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Для начала есть цикл for по которому он итерирует получая строки из переменной deps.
    for (String value : deps) {
    ...
    }


    Далее каждую полученную переменную value при помощи метода split() делит на части и получает массив строк String[]
    value.split("/")
    Например, при разделении: "K1/SK1/SSK1" вы получите String[] values = new String[] {"K1", "SK1", "SSK1"};

    Далее он итерирует по полученному массиву, который был получен при разделении строки на части.
    for (String el : value.split("/")) {
    ...
    }


    Здесь, String start = ""; он инициализирует переменную, так как переменные внутри метода должны быть инициализированы.
    Ответ написан
    Комментировать
  • Как в jpa repository взять данные по дате?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    List<Client> findByUserIdAndRegistrationDate(UUID id, Date date);


    Во-первых,
    findAllBy если хотите получить список, вместо findBy

    Во-вторых, можете показать как именно вы храните в entity дату? LocalDate, LocalDateTime, Date и т.д.
    Ответ написан
    Комментировать
  • Какие требования к созданию приложения по аудиокнигам?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Говоря о бэкенд и веб-приложении мы говорим не о Java SE, а о Java EE.
    Соответственно, вам нужно изучить Java SE + Java EE.
    Далее рекомендую выбрать фреймворк для разработки. Например, Spring.
    Но на самом деле всего этого недостаточно...
    Вам нужно изучить язык SQL (для работы с БД), изучить основы веба - Html, CSS, JavaScript. Не помещает изучить regexp и т.д.
    Знание только Java для веб-разработки недостаточно.
    Ответ написан
    9 комментариев
  • В приложении Android Снова произошел сбой, как решить?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Нуу... а вы пробовали произвести логирование и дебаг?
    Что выдает logcat? Пробовали ли вы в Android Studio добавить Exception Breakpoint и поймать исключение.
    Просто, скриншота, где написано что в приложении есть ошибка недостаточно.
    Также попробуйте воспроизвести ошибку на различных версиях Android и т.д.
    Ответ написан