Как определить, был ли выбран вариант переключения?

#java #arrays #switch-statement #case

Вопрос:

У меня есть проект, над которым я работаю, и он требует, чтобы у меня был массив с установленным размером 5. Затем мне нужно собрать данные из 4 разных случаев и сохранить их 5 раз. (Один из вариантов может быть использован несколько раз, вариант указывается при вводе пользователем). Вот что я попробовал:

 for (count = 0; count < 5; count  ) {
     employeeTypeString = JOptionPane.showInputDialog(null, "What type of employee are you?nnEnter the number that corresponds to your answer.n1. Salariedn2. Hourlyn3. Commissionedn4. Base Plus Commissioned", "Employee Type", JOptionPane.QUESTION_MESSAGE);
     employeeType = Integer.parseInt(employeeTypeString);

     switch (employeeType) {
        case 1:
           firstName = JOptionPane.showInputDialog(null, "What is your first name?", "First Name", JOptionPane.QUESTION_MESSAGE);
           lastName = JOptionPane.showInputDialog(null, "What is your last name?", "Last Name", JOptionPane.QUESTION_MESSAGE);
           ssn = JOptionPane.showInputDialog(null, "What is your social security number?", "SSN", JOptionPane.QUESTION_MESSAGE);
           salaryString = JOptionPane.showInputDialog(null, "What is your weekly salary?", "Salary", JOptionPane.QUESTION_MESSAGE);
           salary = Double.parseDouble(salaryString);
           break;

        case 2:
           firstName = JOptionPane.showInputDialog(null, "What is your first name?", "First Name", JOptionPane.QUESTION_MESSAGE);
           lastName = JOptionPane.showInputDialog(null, "What is your last name?", "Last Name", JOptionPane.QUESTION_MESSAGE);
           ssn = JOptionPane.showInputDialog(null, "What is your social security number?", "SSN", JOptionPane.QUESTION_MESSAGE);
           wageString = JOptionPane.showInputDialog(null, "What is your hourly wage?", "Hourly Wage", JOptionPane.QUESTION_MESSAGE);
           wage = Double.parseDouble(wageString);
           hoursString = JOptionPane.showInputDialog(null, "How many hours per week do you work?", "Hours Worked", JOptionPane.QUESTION_MESSAGE);
           hours = Integer.parseInt(hoursString);
           break;

        case 3:
           firstName = JOptionPane.showInputDialog(null, "What is your first name?", "First Name", JOptionPane.QUESTION_MESSAGE);
           lastName = JOptionPane.showInputDialog(null, "What is your last name?", "Last Name", JOptionPane.QUESTION_MESSAGE);
           ssn = JOptionPane.showInputDialog(null, "What is your social security number?", "SSN", JOptionPane.QUESTION_MESSAGE);
           salesString = JOptionPane.showInputDialog(null, "What are your weekly gross sales?", "Gross Sales", JOptionPane.QUESTION_MESSAGE);
           sales = Double.parseDouble(salesString);
           rateString = JOptionPane.showInputDialog(null, "What percent of commission do you receive?", "Commsission Rate", JOptionPane.QUESTION_MESSAGE);
           rate = Double.parseDouble(rateString);
           break;

        case 4:
           firstName = JOptionPane.showInputDialog(null, "What is your first name?", "First Name", JOptionPane.QUESTION_MESSAGE);
           lastName = JOptionPane.showInputDialog(null, "What is your last name?", "Last Name", JOptionPane.QUESTION_MESSAGE);
           ssn = JOptionPane.showInputDialog(null, "What is your social security number?", "SSN", JOptionPane.QUESTION_MESSAGE);
           salesString = JOptionPane.showInputDialog(null, "What are your weekly gross sales?", "Gross Sales", JOptionPane.QUESTION_MESSAGE);
           sales = Double.parseDouble(salesString);
           rateString = JOptionPane.showInputDialog(null, "What percent of commission do you receive?", "Commsission Rate", JOptionPane.QUESTION_MESSAGE);
           rate = Double.parseDouble(rateString);
           salaryString = JOptionPane.showInputDialog(null, "What is your base pay?", "Base Pay", JOptionPane.QUESTION_MESSAGE);
           salary = Double.parseDouble(salaryString);
           break;

        default:
           JOptionPane.showMessageDialog(null, "Invalid entry!", "Error", JOptionPane.ERROR_MESSAGE);
           break;
     }
     switch (count) {
        case 0:
           employees[0] = new SalariedEmployee(firstName, lastName, ssn, salary);
           break;
        case 1:
           employees[1] = new HourlyEmployee(firstName, lastName, ssn, wage, hours);
           break;
        case 2:
           employees[2] = new CommissionEmployee(firstName, lastName, ssn, sales, rate);
           break;
        case 3:
           employees[3] = new BasePlusCommissionEmployee(firstName, lastName, ssn, sales, rate, salary);
           break;
        case 4:
           employees[4] = new SalariedEmployee(firstName, lastName, ssn, salary);
     }
  }
 

Я планировал заменить последний переключатель(счетчик) чем-то другим, но не уверен, как это сделать. Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я ввожу, этот переключатель(счетчик) всегда будет переходить к следующему, и ему все равно, что я выбрал. Поэтому, если я выберу тип сотрудника 1, а затем выберу тип сотрудника 3, он запросит у меня информацию для типа 3, но отобразит всю информацию для типа 2 (что приведет к пустым результатам).

 salaried employee: john smith
social security number: 111-11-1111
date of birth: null
weekly salary: $800.00
earned $3,200.00

hourly employee: sue jones
social security number: 222-22-2222
date of birth: null
hourly wage: $0.00; hours worked: 0.00
earned $0.00

commission employee: karen price
social security number: 333-33-3333
date of birth: null
gross sales: $10,000.00; commission rate: 0.06
earned $2,400.00

base-salaried commission employee: bob lewis
social security number: 444-44-4444
date of birth: null
gross sales: $5,000.00; commission rate: 0.04; base salary: $300.00
new base salary with 10% increase is: $330.00
earned $2,120.00

salaried employee: jomes allen
date of birth: null
weekly salary: $300.00
earned $1,200.00

Employee 0 is a SalariedEmployee
Employee 1 is a HourlyEmployee
Employee 2 is a CommissionEmployee
Employee 3 is a BasePlusCommissionEmployee
Employee 4 is a SalariedEmployee
 

Как показано выше, на выходе отображается Оплачиваемый, Почасовой, Комиссионный, Базовый плюс, затем Оплачиваемый сотрудник, когда я фактически ввожу Оплачиваемый, а затем снова Оплачиваемый.

Комментарии:

1. switch (count) должно быть switch (employeeType) , нет? В каком случае вы можете объединить два switch блока вместе?

2. Да, объедините 2. Добавьте строки создания объекта непосредственно перед каждым break оператором в 1 switch -м блоке: employees[count] == new .... ?

3. В случае 4 вашего второго переключателя в конце нет оператора break. Возможно, вы по ошибке забыли включить сюда, но попробуйте исправить это, переключатель/регистр очень чувствителен к тому, чтобы в каждом случае были инструкции о разрыве.

4. Я не использовал employees[0] . Я использовал employees[count] . Я предполагаю, что все эти классы являются производными от одного и того же родительского класса.

5. Джонни и Джон, спасибо вам за это. Я не могу поверить, что я просто не сложил их вместе. Огромное спасибо.

Ответ №1:

Если я правильно понимаю, это должно сработать:

 for (count = 0; count < 5; count  ) {
     employeeTypeString = JOptionPane.showInputDialog(null, "What type of employee are you?nnEnter the number that corresponds to your answer.n1. Salariedn2. Hourlyn3. Commissionedn4. Base Plus Commissioned", "Employee Type", JOptionPane.QUESTION_MESSAGE);
     employeeType = Integer.parseInt(employeeTypeString);

     switch (employeeType) {
        case 1:
           // input data (removed for brevity)
           employees[count] = new SalariedEmployee(firstName, lastName, ssn, salary);
           break;

        case 2:
           // input data (removed for brevity)
           employees[count] = new HourlyEmployee(firstName, lastName, ssn, wage, hours);
           break;

        case 3:
           // input data (removed for brevity)
           employees[count] = new CommissionEmployee(firstName, lastName, ssn, sales, rate);
           hours);
           break;

        case 4:
           // input data (removed for brevity)
           employees[count] = new BasePlusCommissionEmployee(firstName, lastName, ssn, sales, rate, salary);
           break;

        default:
           JOptionPane.showMessageDialog(null, "Invalid entry!", "Error", JOptionPane.ERROR_MESSAGE);
           count--;   // Subtract 1 so the loop repeats
           break;
     }
  }
 

Ответ №2:

Вероятно, стоит инкапсулировать тип сотрудника как отдельный класс сущностей/перечисление возвращающих значений для создания/возврата созданного объекта сотрудника.