Переключатель в Java netbeans - PullRequest
1 голос
/ 10 апреля 2020

У меня есть разные поля, использующие одни и те же параметры, т.е. одинаковую шкалу оценок. Я хочу использовать оператор switch, чтобы возвращать оценки для разных полей, используя один и тот же масштаб. Что-то вроде этого. Я думал, что есть что-то вроде этого: switch (attend, job, initiative) {, который объединит три переменные.

int attend = 5;
int job = 5;
int initiative = 5;

switch (attend) {
    case  1:
        getattendo = 5;
        break;
    case  2:
        getattendo = 4;
        break;
    case  3:
        getattendo = 3;
        break;
    case  4:
        getattendo = 2;
    case  5:
        getattendo = 1;
        break;
    default:
        getattendo = 0; // null
}

Ваша помощь приветствуется.

fmk

Ответы [ 3 ]

0 голосов
/ 11 апреля 2020

Enum хорошо работает с переключателями. Таким образом, вы можете определить перечисление, которое представляет ваш диапазон значений, это конечный и разумный диапазон значений:

public enum OPTIONS {
    OPTION1(5, 5, 5),
    OPTION2(5, 2, 4),
    OPTION3(1, 2, 3),
    OPTION4(4, 4, 1);

    private final int attend;
    private final int jobs;
    private final int initiative;

    Directive(int attend, int jobs, int initiative) {
        this.attend = attend;
        this.jobs = jobs;
        this.initiative = initiative;
    }

    // ... optional setters & getters
}

Учитывая ваше создание OPTION Enum, вы можете использовать переключатель для обработки различных случаи:

switch (OPTION) {
    case  OPTION1:
        getattendo = 5;
        break;
    case  OPTION2:
        getattendo = 4;
        break;
    case  OPTION3:
        getattendo = 3;
        break;
    case  OPTION4:
        getattendo = 2;
        break;
    default:
        getattendo = 0; // null
        break;
}

Примечание: Ваш переход действителен только при наличии конечного числа условий. В противном случае используйте метод для расчета вашего результата.

0 голосов
/ 11 апреля 2020

Используемый трюк использует унарный или операцию для проверки наличия двоичного ди git.

Это поможет вам начать переключение в соответствии с различными условиями.

Это похоже на работу с разрешениями для файлов в Linux.

public class ScoreCombinator {
    public static final int ATTEND     = 1; // binary: 001
    public static final int JOB        = 2; // binary: 010
    public static final int INITIATIVE = 4; // binary: 100

    public static void main(String[] args) {
        evaluate(ATTEND | INITIATIVE);       // Attend and Initiative
        evaluate(INITIATIVE | ATTEND | JOB); // Attend, Job, and Initiative
    }

    private static void evaluate(int value) {
        switch (value) {
            case ATTEND: {
                System.out.println("Attend");
                break;
            }
            case ATTEND | JOB: {
                System.out.println("Attend and Job");
                break;
            }
            case ATTEND | JOB | INITIATIVE: {
                System.out.println("Attend, Job, and Initiative");
                break;
            }
            case ATTEND | INITIATIVE: {
                System.out.println("Attend and Initiative");
                break;
            }
            case JOB: {
                System.out.println("Job");
                break;
            }
            case JOB | INITIATIVE: {
                System.out.println("Job and Initiative");
                break;
            }
            case INITIATIVE: {
                System.out.println("Initiative");
                break;
            }
        }
    }
}
0 голосов
/ 10 апреля 2020

Что-то вроде switch(a,b,c) невозможно.

Если все значения одинаковы, просто используйте одно из значений, чтобы убедиться, что все значения совпадают).

Однако существуют Обходные пути, если вы хотите switch - case с несколькими числами:


математическое решение

Например, вы можете использовать простые числа для этого. Поскольку вам нужно только набрать switch чисел, это возможно, если простое число больше, чем максимальное ожидаемое значение (для attend, prime и job).

Вместо switch(attend, job, initiative), вы используете switch((attend*prime+job)*prime+initiative) и вместо case (exampleAttend, exampleJob, exampleInitiative):, вы используете case ((exampleAttend*prime+exampleJob)*prime+exampleInitiative):

Обратите внимание, что prime должно быть одинаковым в операторах switch и case.

Обратите внимание, что вы должны проверить, является ли какое-либо из входных чисел больше, чем простое число. Это логически может привести к случаю по умолчанию, но может привести к коллизиям.

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

С другой стороны, этот метод должен быть более быстродействующим, чем второй.


простая конкатенация строк

Другой вариант - работа со строками. Поскольку строковое представление числа является уникальным (для числа) и не содержит некоторых символов (например, пробелов), вы можете объединить эти числа и использовать такой символ для их разделения.

Вместо switch(attend, job, initiative), вы используете switch(attend+" "+job+" "+initiative) и вместо case (exampleAttend,exampleJob,exampleInitiative):, вы используете case (exampleAttend+" "+exampleJob+" "+exampleInitiative):.

Это, очевидно, проще и безопаснее, чем первый метод с простыми числами, но должно быть влияние на производительность как конкатенация Строки медленнее, чем умножение целых чисел.


Другая возможность - использовать перечисления. Посмотрите на другой ответ от @ Hassam Abdelillah , если вы хотите узнать, как это работает. Если вам нравится подход enum, не стесняйтесь высказать другой ответ.

...