【问题标题】:Switch case requiring two calls to actually workSwitch case 需要两次调用才能实际工作
【发布时间】:2016-03-06 01:27:10
【问题描述】:

我在 while 循环中有一个开关,有很多情况可以对一组数字运行基本的统计分析。我们正在努力将简单的值数组替换为用户可以添加到的多个数据集的双精度数组映射。我添加了一个“添加”案例,它可以成功地添加到地图中……在每次 other 运行时。因此,当我将“添加数据集 1 2 3 4 5”写入扫描仪时,没有任何反应,但如果我再次将其写入扫描仪,它将成功添加。这是重要的代码,让我知道你能用它做什么。 getOption() 是一种通过扫描仪获取字符串、将其拆分为单个单词并将这些单词输入字符串数组的方法。输入的格式是“case keyForMap valuesForMap”。我知道我们不应该假设用户会遵循这种格式,但我们会让它在这个任务中滑动。 getValues() 获取数组中的数字,将它们解析为 double,然后将它们添加到新的 double 数组中,然后返回。

HashMap<String,double[]> dataMap = new HashMap();
...
public void driver(){
    Stats s = new Stats(data);
    String[] options = getOption();
    while (!"quit".equals(options[0])){
    switch (options[0]) {
        case "add": if (getOption().length < 2){
                        break;
                    }
                    else{
                        dataMap.put(options[1], getValues(options));
                    }
                    break;

        case "summary": //Arrays.toString(dataMap.entrySet().toArray());
                        System.out.println(dataMap.containsKey("dsn"));
                        break;
        case "quit": return;
        default: System.out.println(options[0] + " is not a legal option");
    }
    options = getOption();
    }
}

【问题讨论】:

  • if 语句的 then 部分中的 break 是否会脱离 switch?即使是这样,if (!...) {...} break; 会不会更干净一点?
  • 在交换机中处理“退出”有什么意义?您已经在检查“退出”作为循环终止条件。
  • 所有优点,我刚才添加了退出案例并忘记了它。此外,if/else 位似乎有效,因为没有它,用户只运行“添加”而没有其他值会得到负数组大小错误,因为 getValues() 创建一个具有用户输入数组长度的数组 - 2。
  • 你提到它第二次工作。如果您第二次键入不同的内容,实际执行的是哪一个?第一个还是第二个?
  • @JoshuaTaylor 它确实打破了开关。

标签: java arrays switch-statement


【解决方案1】:

if (getOption().length &lt; 2) 替换为if (options.length &lt; 2)。在那里调用方法意味着您正在获取一个全新的输入行,而不是使用已有的输入行,然后在仅检查其长度后将其丢弃。

【讨论】:

  • 感谢您的指点,它为我清除了很多关于方法调用的信息。调用 getValues(options) 很好,因为选项数组没有改变,对吗?
  • @Qdhcjv 是的,如果 getValues 既不修改选项(基于选项构建新数组不算数)也不从其他地方获取输入,它甚至是安全的 - 虽然很浪费 - 多次调用它.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多