2014-01-27 5 views
2

Я пытаюсь использовать оператор switch в моей системе классификации, и я не нашел подходящего способа включить диапазон значений в раздел case switch. Я же исследовал здесь и нашел применение isBetween:Использование метода в разделе case оператора switch

public static isBetween(int x, int lower, int upper) 
{ 
    return lower <=x && x<=upper; 
} 

Я попытался использовать это таким образом, чтобы проверить, если знак был представлен между диапазоном 1-20:

switch (mark) { 
    case isBetween(0, 20): 
     System.out.println("Grade is E"); 
     break; 
    case isBetween(21, 29): 
     System.out.println("Grade is D"); 
     break; 
} 

Я знаю, это неправильно, так как это не работает. Кто-нибудь поможет исправить мой код? В этом случае я должен использовать оператор switch.

+5

Вы можете дать только константы, как случай 0. или случай 20. Функции не являются позволил. –

+0

Это просто невозможно с помощью переключателя. (За исключением чего-то безумного, как случай для всех чисел 0 ... 29 и провалов.) – Radiodef

+1

Вам не нужен тип возврата в единственном методе, который должен быть 'boolean'. – Tiny

ответ

3

В операторе switch каждый case оценивает, равен ли входной параметр в switch(param) этому случаю. Например, если бы я написал switch(3), то выполнил бы только case 3:.

Здесь пара проблем. Во-первых, метод в вашем case возвращает boolean, но вы делаете переключатель на int. Поэтому, когда код проверяет, соответствует ли входной параметр markisBetween(0,20), он пытается сравнить int и boolean. На самом деле вы этого не хотите. Вы хотите узнать, является ли mark одним из значений 0, 1, 2, 3, 4, 5 .. 20. Если бы вы использовали здесь пример case, вам нужно было бы сравнить mark с case для каждого из этих значений ,

Во-вторых, как утверждает Эрик, вам нужно использовать статические значения в своих операциях case. Это означает, что вы не можете вернуть функцию String, так как она может меняться в зависимости от внутренних функций.

Кроме того, isBetween() требует ввести число, которое хотите определить, между двумя другими. Прямо сейчас ваш код не имеет правильного количества входов. Метод должен также заявить, что он возвращает boolean, как указывал Tiny. Определяя метод, вам всегда нужен тип возврата.

Лучший способ сделать это, вероятно, не использовать переключатель-случай, и будет выглядеть примерно так:

public static boolean isBetween(int x, int lower, int upper) 
{ 
    return lower <=x && x<=upper; 
} 

public void printMark(int mark){ 
    if(isBetween(mark, 0, 20)) 
     System.out.println("Grade is E"); 
    else if(isBetween(mark, 21, 29)) 
     System.out.println("Grade is D"); 
} 

Поскольку вы должны использовать переключатель-случай, я бы настроить его так, это так :

private static final int GRADE_E = 0; 
private static final int GRADE_D = 1; 

public static boolean isBetween(int x, int lower, int upper) 
{ 
    return lower <=x && x<=upper; 
} 

private int getMarkCode(int markParam){ 
    if(isBetween(markParam, 0, 20)) 
     return GRADE_E; 
    else if(isBetween(markParam, 21, 29)) 
     return GRADE_D; 
} 

public void printMark(int mark){ 
    switch(getMarkCode(mark)){ 
     case GRADE_E: 
      System.out.println("Grade is E"); 
      break; 
     case GRADE_D: 
      System.out.println("Grade is D"); 
      break; 
    } 
} 

Обратите внимание, что это длиннее первого и достаточно избыточно. Также обратите внимание, как я назвал коды, которые я использовал в инструкции case. Многие заявления о делах, которые вы видите хорошо написаны, не будут использовать числа, но вместо этого будут использовать описательные имена. Особенно, когда вы используете коды без какого-либо неотъемлемого значения, как я сделал здесь с 0, представляющим класс E и 1, представляющий оценку D, вы хотите описательное имя. Однако, как правило, вам следует избегать использования кодов и вместо этого использовать значение, которое пытается попытаться представить код, будь то строка, int или какой-либо тип объекта.

+0

Didericis, это помогает, но в этом случае я хотел использовать конструкцию switch-case ... Я исправил ошибку, которую вы указали, спасибо. –

+0

@BrianNyagol Нет проблем. Я отредактирую свой ответ с лучшим способом использования конструкции switch. – Didericis

+0

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

1

Если вы «должны» использовать переключатель/случай заявление, попробуйте:

char grade='?'; 
switch (mark) { 
    case 0: 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    case 9: 
    case 10: 
    case 11: 
    case 12: 
    case 13: 
    case 14: 
    case 15: 
    case 16: 
    case 17: 
    case 18: 
    case 19: 
    case 20: 
     grade='F'; // I've never seen anyone given a grade of 'E'... 
     break; 
    case 21: 
    case 22: 
    case 23: 
    case 24: 
    case 25: 
    case 26: 
    case 27: 
    case 28: 
    case 29: 
     grade='D'; 
     break; 
} 
System.out.println("Grade is "+grade); 

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

+0

Это то, что я должен был сделать наконец, хотя я буду принимать if-else, предложенный Дидерисисом в моей следующей программе. –

+0

Для '' '' '' '' 'потребуется немного больше программного пространства, но выполняется бит быстрее, чем if/else. Недостаточно, чтобы изменить ситуацию в большинстве случаев, но что-то иметь в виду при кодировании внутреннего цикла. – keshlam

1

что, если

public static void main(String[] args) { 
    Grade g = Grade.gradeValueOf(20); 
    switch(g){ 
    case D: 
     //do something for D 
     break; 
    case E: 
     //do something for E 
     break; 
    } 
} 

и

public enum Grade { 
E(0,20),D(21,29); 
private int min,max; 

private Grade(int min, int max) { 
    this.min = min; 
    this.max = max; 
} 

public static Grade gradeValueOf(int val){ 
    for(Grade g:Grade.values()){ 
     if (g.min <= val && val <= g.max){ 
      return g; 
     } 
    } 
    return null; 
} 
} 

вы все еще используете переключатель :-)

+0

Enum отлично, потому что вы можете просто сделать что-то вроде 'System.out.println (« Grade is »+ Grade.inBetween (mark));' хотя я бы назвал метод чем-то более согласующимся с соглашением типа 'gradeValueOf'. – Radiodef

+0

предложение принято. спасибо – Leo

+0

Leo Я не понимаю ваш код ... это правильно -> Вы создаете подкласс класса 'gradeValueOf()' в классе и передаете аргумент 'int Val'? Я также получаю эту ошибку на Netbeans -> Незаконный старт выражения ... в точке 'public enum Grade {' –

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