2016-03-27 6 views
3

Переменная a может быть 0, 1 или 2, где значение равно числу дополнительных условий цикла. Я могу сделать это, используя switch и case, но мне интересно, есть ли лучший способ сделать это?Дополнительные условия цикла ... на основе условия

switch (a) { 
    case 0: while (condition_1) { 
     // ... 
    } break; 
    case 1: while (condition_1 || condition_2) { 
     // ... 
    } break; 
    case 2: while (condition_1 || condition_2 || condition_3) { 
     // ... 
    } break; 
} 

Решение этой проблемы в Python было использовать словарь и хранить соответствующие лямбда-выражений в соответствующем индексе. Однако мои условия «не являются окончательными или окончательно окончательными», поэтому они не могут использоваться в выражении лямбда в Java.

Целью здесь является не получение либо while (true), либо while (false), и покончить с этим. Это должно начаться с while (...something), который оценивается false. Затем внутри цикла делайте что-то, что меняет все условия на истинные по одному. Но пока все условия не верны, продолжайте цикл.

код Псевдо (я знаю, что есть некоторые недостатки, просто для демонстрации):

a can be 0,1,2 

p = 5 
q = 7 
r = 10 
s = 14 

if a = 1 
while p != q -> p+=1 
if a = 2 
while p!= q || p!= r -> p+=1 

Кроме того, это научить меня ловить рыбу вместо того, чтобы дать мне вопрос типа рыбы.

+0

вам нужен помощник, который возвращает логическое значение. – HuStmpHrrr

+0

Пожалуйста, не делайте двойной публикации http://stackoverflow.com/questions/36025026/have-extra-while-loop-conditions-based-on-a-condition?lq=1 – MCMastery

+3

@MCMastery Это python, это java , и ОП объясняет, почему этот подход (предположительно) не работает в java –

ответ

0

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

private boolean helper(a) { 
    boolean b = false; 
    switch (a) { 
     case 2: b = b || condition_3; 
     case 1: b = b || condition_2; 
     case 0: b = b || condition_1; 
    } 
    return b; 
} 

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

+0

Что делать, если 'a' намного больше, чем 500? –

+0

, тогда вы тратите свое время на то, чтобы писать 500 различных условий, не желая писать еще несколько «case n's? – HuStmpHrrr

+0

Я имел в виду в случае, когда у вас есть программа для вычисления условий в чем-то вроде массива вместо того, чтобы вручную набирать их все. –

1

Предположим, у вас есть список условий.

boolean[] condition = new boolean[n]; 

a это число булевы вы хотите проверить, так просто создать новую переменную

boolean valid = false; 


//check all conditions up to a 
for (int i = 0; i < a; i++) { 
    if (condition[i]) { 
     valid = true; 
     break; 
    } 
} 

while (valid) { 
    //perform action and then run the checking valid code again 
} 

В этом случае, вы будете проверять на a условиях в общей сложности, который является то, что вы хотите ,

+0

как бы вы инициализировали массив? – HuStmpHrrr

+0

Мы предполагаем, что OP уже получил свое условие booleans и создает массив с теми –

+0

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

Смежные вопросы