java 在switch中使用关系运算符

qgelzfjb  于 2023-04-04  发布在  Java
关注(0)|答案(8)|浏览(123)

有没有一种方法可以在switch语句中使用关系运算符(〈,〈=,〉,〉=)?

int score = 95;

switch(score)  {
   case (score >= 90):
      // do stuff
}

上面例子(显然)不起作用

alen0pnh

alen0pnh1#

你不能

来自jls-14.11

The type of the Expression must be char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type (§8.9), or a compile-time error occurs.

关系运算符(〈,〈=,〉,〉=)的结果是boolean,这是不允许的。
以下所有条件必须为真,否则将发生编译时错误:

  • 与switch语句相关的每个case常量表达式必须可赋值(第5.2节)到switch表达式的类型。
  • 与switch语句相关联的两个case常量表达式不能具有相同的值。
  • 没有开关标签为空。
  • 同一个switch语句最多只能关联一个默认标签。
lc8prwob

lc8prwob2#

如果需要使用switch本身,这可能会有所帮助,

char g ='X';
            int marks = 65;
            switch(marks/10)
            {
                case 1:
                case 2:
                case 3:
                case 4: g = 'F';
                        break;
                case 5: g = 'E';
                        break;
                case 6: g = 'D';
                        break;
                case 7: g = 'C';
                        break;
                case 8: g = 'B';
                        break;
                case 9: 
                case 10: g = 'A';       
                         break;
            }
            System.out.println(g);

是这样的

if(marks<50)
                g='F';
            else if(marks<60)
                g='E';
            else if(marks<70)
                g='D';
            else if(marks<80)
                g='C';
            else if(marks<90)
                g='B';
            else if(marks<=100)
                g='A';
hl0ma9xz

hl0ma9xz3#

不幸的是没有,尽管你可以通过将多个case语句分组而不使用break来使用case fall(有点黑客),并在范围结束时实现代码:

int score = 95;
switch(score) {
 ..
 case 79: System.out.println("value in 70-79 range"); break;
 case 80:
 ..
 case 85: System.out.println("value in 80-85 range"); break;
 case 90:
 case 91:
 case 92:
 case 93:
 case 94:
 case 95: System.out.println("value in 90-95 range"); break;
 default: break;
}

恕我直言,使用if更适合您的特定情况。

o2rvlv0m

o2rvlv0m4#

它永远不会工作。你应该首先了解switch是做什么的。
它将执行与switch参数匹配的case下的语句。
在这种情况下,score是一个参数,它是95,但score>=90将始终评估为truefalse,并且永远不会匹配整数。
你应该使用if语句。
Java也不允许在开关情况下使用booleans

oyt4ldly

oyt4ldly5#

简单

int score = 95;

switch(score)  {
   case (score >= 90):
      // do stuff
}

您正在向switch传递一个int值。因此case必须是int值,其中

(score >= 90)

转动boolean
您的病例是if else的良好候选病例

pgx2nnw8

pgx2nnw86#

docs for switch-case语句状态:
switch语句仅基于单个整数、枚举值或String对象测试表达式。
所以没有布尔值。这样做没有意义,因为你只有两个值:true或false。
您可以编写一个方法来检查分数,然后返回switch可以处理的类型之一
例如:

enum CheckScore {
    SCORE_HIGHER_EQUAL_90,
    ...
}

public CheckScore checkScore(int score) {
    if(score >= 90) {
        return SCORE_HIGHER_EQUAL_90;
    } else if(...) {
        return ...
    }
}

然后在交换机中使用它:

switch(checkScore(score))  {
   case SCORE_HIGHER_EQUAL_90:
      // do stuff
}

...或者你可以直接使用if, else-if, else

ih99xse1

ih99xse17#

显然,这不可能作为一种语言结构。但是,为了好玩,我们可以自己实现它!

public class Switch<T, V> {

    public static interface Action<V> {
        V run();
    }

    private final T value;
    private boolean runAction = false;
    private boolean completed = false;
    private Action<V> actionToRun;

    public Switch(T value) {
        this.value = value;
    }

    static public <T, V> Switch<T, V> on(T value) {
        return new Switch<T, V>(value);
    }

    public Switch<T, V> ifTrue(boolean condition) {
        runAction |= condition;
        return this;
    }

    public Switch<T, V> ifEquals(T other) {
        return ifTrue(value.equals(other));
    }

    public Switch<T, V> byDefault(Action<V> action) {
        this.actionToRun = action;
        return this;
    }

    public Switch<T, V> then(Action<V> action) {
        if (runAction && !completed) {
            actionToRun = action;
            completed = true;
        }
        return this;
    }

    public V getResult() {
        if (actionToRun == null) {
            throw new IllegalStateException("none of conditions matched and no default action was provided");
        }
        return actionToRun.run();
    }
}

Switch接受任何要打开的值,然后提供通过布尔条件(ifTrue方法)或精确匹配(ifEquals方法)进行匹配的功能。提供要打开的值只是后一个功能所需的。
在建立条件之后,用户调用getResult来获得结果。
例如,我们可以创建一个方法来告诉我们它对我们的分数的看法:

String tellMeMyScore(int score) {
    return Switch.<Integer, String> on(score).byDefault(new Action<String>() {
        public String run() {
            return "really poor score";
        }
    }).ifTrue(score > 95).then(new Action<String>() {
        public String run() {
            return "you rock!";
        }
    }).ifTrue(score > 65).then(new Action<String>() {
        public String run() {
            return "not bad, not bad";
        }
    }).ifEquals(42).then(new Action<String>() {
        public String run() {
            return "that's the answer!";
        }
    }).getResult();
}

这个简单的测试:

for (int score : new int[] { 97, 85, 66, 55, 42, 32, 4 }) {
    System.out.println(score + ": " + tellMeMyScore(score));
}

打印输出:

97: you rock!
85: not bad, not bad
66: not bad, not bad
55: really poor score
42: that's the answer!
32: really poor score
4: really poor score
nbewdwxp

nbewdwxp8#

如果关系运算符不起作用,则使它们起作用的唯一方法是擦除关系运算符并手动输入单词。
例如:

System.out.println("Enter your grade: ");
int grade=kb.nextInt();

switch(grade) {
     case (80 | 81 | 82 | 83 | 84 | 85):
       System.out.println("LOW GRADES");
     case (86 | 87 | 88 | 89 | 90 | 91 | 92 | 93):
       System.out.println("AVERAGE GRADES");
    //so on, and so for until 100...
}

相关问题