Как правильно использовать оператор "&" в части перечисления нескольких элементов из списка?

Как правильно использовать оператор "&" в части перечисления нескольких элементов из списка?

Либо какой способ лучше выбрать, чтобы код заработал?

import java.util.Scanner;

public class Checkyourexp {
    public static void main(String[] args)
    {
        System.out.print("Введите опыт торговли на финансовых рынках от 0 до 99 лет: ");
        Scanner user_input = new Scanner(System.in);
        int traderExperience = Integer.parseInt(user_input.next());

        String mrating;
        System.out.print("Выберите финансовый инструмент из списка: валюта, акции, облигации, фьючерсы, опционы, криптовалюты, NFT");
        mrating = user_input.next();
        
        if ((traderExperience == 0) || (mrating.equalsIgnoreCase("акции")) || (mrating.equalsIgnoreCase("фьючерсы")) || (mrating.equalsIgnoreCase("опционы"))
                ||(mrating.equalsIgnoreCase("криптовалюты")) || (mrating.equalsIgnoreCase("NFT")))
        {
            System.out.print("Вы не опытный трейдер, Вам нужны советы, обратите внимание на облигации либо попробуйте начать с торговли на валютных рынках");

        }

        else if (traderExperience ==1) || mrating.equalsIgnoreCase("опционы") || mrating.equalsIgnoreCase("криптовалюты") || mrating.equalsIgnoreCase("NFT")) {
            System.out.print(" Вы начинающий трейдер, но мы не рекомендуем вам криптовалюты, опционы либо NFT ");
        }

        else if ((traderExperience >= 2) && mrating.equalsIgnoreCase("NFT")) {
            System.out.print("У Вас хорошие навыки, но лучше попробуйте попрактиковаться ещё минимум год, и вернуться к теме NFT");
        }
        else {
            System.out.print("Вы уже достаточно опытны, чтобы самостоятельно принимать решение по торговле тем или иным финансовым инструментом");
        }

    }

}



Ответы (2 шт):

Автор решения: Alex Rudenko

Замечания по коду:

  • & - это побитовый оператор И; в данном случае следует использовать логический оператор &&
  • Для проверки, содержит ли mrating одно из многих допустимых значений следует использовать оператор логическое ИЛИ || -- переменная mrating не может одновременно быть равна двум и более разным строкам.
  • Поскольку строки являются объектами, их сравнение следует выполнять при помощи методов String::equals/String::equalsIgnoreCase, а не оператора ==, который будет сравнивать ссылки на строки, а не их значения
  • Так как для пользовательского ввода используется Scanner::next, то введённые слова не будут содержать пробелов, как в случае " криптовалюты "
  • Условия if (num_age >= 1 ...) if (num_age >= 2 ...) могут выполниться два раза, вероятно между ними должен быть оператор else.
  • Вместо проверки условий if (mrating.equalsIgnoreCase(t1) || mrating.equalsIgnoreCase(t1) ...), можно создать множество допустимых значений Set<String> m1 = Set.of("опционы", "криптовалюты", "NFT", "фьючерсы", "акции") и т.п., тогда можно использовать метод Set::contains: if (m1.contains(mrating.toLowerCase()))
  • название переменной user_age всё-таки обозначает возраст пользователя, а не стаж трейдера traderExperience, также следует обратить внимание на соглашение об именах переменных/классов, принятое в Джаве, в частности, что названия переменных/методов записываются в camelCase.

Полностью исправленный код не приводится, работу над указанными ошибками следует проделать самостоятельно.

→ Ссылка
Автор решения: Дима Ерохин

Добавлю к ответу и к коментам выше. Оператор & можно использовать , если все операнды типа boolean, иначе это уже побитовая операция, а && - это укороченное AND которое используется только с boolean. И зачем нужен Integer.parseInt если Сканер на то и Сканер , что у него есть методы парсинга :

  1. next (); считывает ввод до пробела
  2. nextLine (); всю стрроку до \n и переходит на следующую
  3. nextInt ();
  4. nextDouble ();
→ Ссылка