Вопрос по logic, switch-statement, java – Проблема с использованием переключателя в Java

1

Я не могу понять, почему он всегда возвращает значение arg1. Я строю преобразователь веса.

public double convert(double arg1,int arg2,int arg3) {
    // arg1 = amount, arg2 = from, arg3 = to
    double milligram = 1;
    double gram = 1000;
    double ounce = 28349.5;
    double pound = 453592;
    double answer = 0;
    switch(arg2) {
    case 0: switch(arg3) { // if milligram
            case 0: answer = (arg1 * milligram) / milligram;
            case 1: answer = (arg1 * milligram) / gram;
            case 2: answer = (arg1 * milligram) / ounce;
            case 3: answer = (arg1 * milligram) / pound;
    }
    case 1: switch(arg3) { // if gram
            case 0: answer = (arg1 * gram) / milligram;
            case 1: answer = (arg1 * gram) / gram;
            case 2: answer = (arg1 * gram) / ounce;
            case 3: answer = (arg1 * gram) / pound;
    }
    case 2: switch(arg3) { // if ounce
            case 0: answer = (arg1 * ounce) / milligram;
            case 1: answer = (arg1 * ounce) / gram;
            case 2: answer = (arg1 * ounce) / ounce;
            case 3: answer = (arg1 * ounce) / pound;
    }
    case 3: switch(arg3) { // if pound
            case 0: answer = (arg1 * pound) / milligram;
            case 1: answer = (arg1 * pound) / gram;
            case 2: answer = (arg1 * pound) / ounce;
            case 3: answer = (arg1 * pound) / pound;
    }
    } // end arg2 switch
    return answer;
}

Я где-то напутал в моей логике, но не вижу где. Любая помощь будет оценена.

@irrelephant Я предпочитаю использовать операторы switch, так как их легче понять. Я давно ими не пользовался, поэтому совершенно забыл о необходимости разбивать каждый случай. dead beef
Почему бы вам просто не назвать количество аргументов от и до? Brendan Long
В этом случае было бы лучше использовать массивы и вообще убрать переключатели. Что-то вродеanswer = (arg1 * conv[arg2]) / conv[arg3]; irrelephant
Я только предлагаю это, так как вы сможете сократить код примерно с 30 строк до 2 :-) irrelephant

Ваш Ответ

5   ответов
0

Кроме использованияbreak, с помощьюreturn заявления делает свое дело так же, как это также предотвращает падение через случаи.

case 2: switch(arg3) { // if ounce
    case 0: return (arg1 * milligram) / milligram;
2

переписать каждый случай, как это

case 2: switch(arg3) { // if ounce
        case 0: answer = (arg1 * ounce) / milligram;break;
        case 1: answer = (arg1 * ounce) / gram;break;
        case 2: answer = (arg1 * ounce) / ounce;break;
        case 3: answer = (arg1 * ounce) / pound;break;
9

Вам не хватаетbreak заявления:

case 0: 
   answer = (arg1 * milligram) / milligram;
   break;
   ...
Спасибо, это сработало. dead beef
0

Вы должны использоватьbreak в выражениях switch, иначе ваш результат может быть смещен

0

Вложенные операторы case довольно сложны для чтения и сложны для отладки. Лучше было бы вместо этого инкапсулировать необходимую вам функциональность в вызов метода.

Это сказанное, нетbreak заявление в любом месте вашего коммутатора. Независимо от случая, он будет проходить до последнего случая (установив ответ, равный основанию случая).

Похожие вопросы