Android: не может выбрать несколько операторов if или вложенных переключателей - PullRequest
0 голосов
/ 21 февраля 2011

Я создаю приложение для Android, которое будет вызывать метод, который анализирует выбранный элемент нескольких вращающихся объектов. Я очень новичок в Java, и я не уверен, какое утверждение лучше всего использовать с точки зрения потока программы в этом случае. Должен ли я просто использовать несколько операторов If? Такие как:

If(spinner1.getSelectedItemPosition() == 0 && spinner2.getSelectedItemPosition() == 2 && spinner3.getSelectedItemPosition() == 4)
/* do some stuff

Или лучше использовать операторы switch?

switch(spinner1.getSelectedItem())
case 1:
    switch(spinner2.getSelectedItem())
    case 1:
        switch(spinner3.getSelectedItem())
        case 1:
        /* do something

По сути, я пытаюсь оценить выбранный элемент каждого объекта счетчика, а затем создать новое действие на основе этой оценки. Однако начальное действие состоит из нескольких блочных блоков, в каждом из которых есть несколько опций, поэтому я не уверен, что лучше всего разработать контрольные операторы. Использование оператора if для каждой возможной комбинации выбранных элементов кажется немного громоздким. Кроме того, я не уверен, какая опция на самом деле заставит код работать так, как я намереваюсь.

Ответы [ 5 ]

2 голосов
/ 21 февраля 2011

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

1 голос
/ 21 февраля 2011

Возможно, оператор switch будет более эффективным, потому что вы можете отправить несколько результатов в один и тот же фрагмент кода (похоже, это может быть необходимо для вашего приложения), например:

switch(value) {
case 0:
case 1:
    //Do THIS
    break;
case 2:
    //Do THAT
    break;
default:
    //Doesn't match any
}

Если значение оценивается каклибо 0, либо 1, первый раздел будет выполнен, и вы должны были написать код операции только один раз.Что касается специфики (сейчас я только начинаю творчески подходить), вы можете сдвинуть три значения счетчика в одно целое число и включить результат.Если вы напишите операторы case в шестнадцатеричном формате, они будут более читабельными в отношении состояния каждого из них.

int result = 0;
result += (byte)(spinner1.getSelectedItemPosition() << 16);
result += (byte)(spinner2.getSelectedItemPosition() << 8);
result += (byte)(spinner3.getSelectedItemPosition());

switch(result) {
case 0x000000: //All spinners 0
case 0x010201: //S1 = 1, S2 = 2, S3 = 1
    //Do something
    break;
case 0x010101: //S1 = 1, S2 = 1, S3 = 1
    //Do something else
    break;
default:
    //Everything else (good if most of your options go to the same Activity)
}

Надеюсь, что это поможет!

Возможный недостаток этого примера: разрешено только 256 параметровдля каждого блесны;)

0 голосов
/ 21 февраля 2011

С чисто производительной точки зрения операторы переключения работают быстрее.Исходное выражение, переданное в переключатель, оценивается один раз, а затем проверяется на соответствие значениям регистра.Для оператора if каждый раз проверяется как левая, так и правая части проверки if.Поэтому использование операторов if будет немного медленнее.

0 голосов
/ 21 февраля 2011

Итак, у каждого из четырех счетчиков есть x состояний? Или вы хотите захватить только одно определенное состояние и иметь некоторую ветку 'else' для других?

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

В зависимости от входных данных вы также можете сделать что-то еще:

Если у вас есть 4 счетчика, умножьте положение первого на 1000, второго на 100, третьего на 10 и последнего на 1. Затем сложите числа и соберите фонд с несколькими тысячами case: заявления): -)

0 голосов
/ 21 февраля 2011

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

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

...