【问题标题】:I Need to use switch statement for range values in java [duplicate]我需要在java中对范围值使用switch语句[重复]
【发布时间】:2016-10-10 11:38:23
【问题描述】:

我需要为可以使用 if else 的范围值实现 switch 语句,但我认为 switch 的性能会更好。

我有要求,如果变量的值在 1-150 之间,我将处理我的逻辑。如果变量的值在 150-300 之间的范围内,那么其他一些逻辑,如果范围在 300-450 之间,那么一些不同的逻辑等等。

那么在这种情况下我该如何使用 switch,因为我通常使用具有固定值的 switch。 提前致谢。

【问题讨论】:

  • 向我们展示您首先尝试了什么。 “我可以使用 if else 但我认为 switch 的性能会更好” 不要担心这些简单示例的“性能”。担心让程序首先运行。
  • 您可以执行一些算术来将每种情况转换为特定的常量。但是您最好使用if 语句。 switch 语句不适用于范围。
  • 应该回答你的问题:stackoverflow.com/questions/10873590/…
  • 您是否有证据表明使用 if/else 不符合您的性能标准?这些性能标准是什么
  • 如果您担心性能,请考虑分析您的应用程序。您可能会发现性能问题不在您的 ifswitch 语句中,而是在 GUI 或字符串操作中。

标签: java


【解决方案1】:

我建议你使用公式

switch (value / 150) {
   case 0: // 0 - 149
          break;
   case 1: // 150 - 299
          break;
   case 2: // 300 - 449
          break;
   default: // otherwise.
}

如果您使用 (value-1)/150,您会得到 1-150、151-300、301-450 等

编辑:由于整数除法的性质,case 0 也将在 switch ((value-1)/150){...} 中接受 -148 - 0。为了避免这种情况,可以使用 if/else 语句以及条件运算符。

【讨论】:

  • 非常有创意的答案
  • @AmberBeriwal 欢呼,例如,如果你除以 50,你可以有不同大小的范围而不会太复杂。
【解决方案2】:

这是不可能的。

如果您检查Java Language Specification for switch,您会发现case 之后的表达式必须是ConstantExpressionEnumConstantName
这些都不能是范围。

在 cmets 中已经指出了一些替代方案。您可以使用if 语句;除非您有大量案例,否则在性能方面应该不会有太大差异。
或者您可以(根据this answer, linked in the comments by @tomas)创建单独的函数来区分不同的范围。

如果范围是常规的(例如 101-200、201-300 等),您也可以使用公式。小心舍入错误!测试公式的边缘情况以确保它是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多