【问题标题】:using integer variables in switch statements in java [duplicate]在java中的switch语句中使用整数变量[重复]
【发布时间】:2018-01-03 11:10:16
【问题描述】:

我最近遇到了和这个有点类似的情况。

Scanner sc = new Scanner(System.in);
int a = sc.nextInt(), ... , g = sc.nextInt(), x = sc.nextInt(), y = sc.nextInt(), z;
z = x * y;
switch (z)    {
    case a : //print something 
    break;
    .
    .
    .
    case g : //print something 
    break;
    default : //print something 
    break;
}

我遇到了所有案例标签的错误。我检查了一些教程,并没有得到所有的答案。我需要知道是否可以使其与 switch 语句一起使用,因为这是我必须使用的约束。

【问题讨论】:

  • 简单:你不能在那里使用变量。您必须使用固定值或 if-else 语句
  • "需要常量表达式" 很有表现力,它需要一个常量,而不是变量
  • case 标签使用编译时常量表达式 (docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28),您不能使用动态值。
  • @NishanthRao 再次:不。这不会编译。如果你需要比较变量,你会被 if-else 语句困住
  • 如果 a==g==1,您希望发生什么?

标签: java switch-statement conditional


【解决方案1】:

正如 cmets 中所指出的,您不能将变量用作 switch case。

当您发现自己对多个变量执行相同操作时(例如将 sc.nextInt() 分配给每个变量 ag),您应该考虑改用循环。

例如:

ArrayList<Integer> inputs = new ArrayList<>();
for (int i = 0; i < 7; i++) {
  inputs.add(sc.nextInt());
}

然后,您可以简单地遍历您的列表,而不是您的 switch 语句。

for (int i : inputs) {
  if (z == i) {
    doSomething();
  }
}

【讨论】:

    【解决方案2】:

    您可以简单地在整数和方法之间生成映射。由于您的所有评论都表明这将打印一些内容,假设您想要一个String,所以您想基于一个整数“提供”一个String

    首先,让我们定义一些函数:

    List<Supplier<String>> functions = new ArrayList<>();
    functions.add(() -> "Function #1");
    functions.add(() -> "Function #2");
    functions.add(() -> "Function #3");
    functions.add(() -> "Function #4");
    

    然后,让我们为每个函数创建一个映射:

    Map<Integer, Supplier<String>> map = new HashMap<>();
    for(Supplier<String> s : functions){
        System.out.print("Define a key for the next function :" );
        map.put(sc.nextInt(), s);
    }
    

    就是这样,您已经为每个功能定义了(不是说如果您输入两次相同的键,则只有最后一个功能将设置为该功能,如果您愿意,可以使用Collection

    让我们获取函数并执行它以获取值:

    System.out.println("Execute:");
    String value = map.get(sc.nextInt()).get();
    

    这是一个简短的代码,不会阻止任何NullPointerException 的发生,这不是本答案的主题。

    PS:别忘了关闭Scanner

    sc.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多