繁体   English   中英

用户输入->字符串数组->强制转换的双打不起作用

[英]User input -> array of strings -> casted doubles not working

我有一个比较简单的程序,遇到了问题。 它应该接受用户输入,将行按空格分开,然后将各个单词作为字符串转储到String []数组中。 这一切都很好。 但是,我需要采用数字值(我们知道哪些单词已经可以转换,无需检查),将它们转换为双精度型,将双精度型添加到数组中,然后返回它。 我无法从用户输入中返回它的值,但是如果我给定getValues()方法(将String转换为double然后将其添加到数组的方法)直接(例如{“ 1”,“ 2”, “ 3”,“ 4”}),它可以正常工作。 用户输入的字符串数组不起作用。

double data[] = {3.0, 15.0, 7.0, 27.0};
HashMap<String,double[]> dataMap = new HashMap();

public String[] getOption(){
    Scanner input = new Scanner(System.in);
    System.out.println("\nInput string\n");
    String line = input.nextLine();
    return split(line);
}

public String[] split(String line){
    String[] optionLine = line.split(" ");
    return optionLine;
}

public double[] getValues(String[] inputs){
double values[] = new double[inputs.length - 2];
for (int i = 2; i < inputs.length; i++){
    double valueDouble;
    valueDouble = Double.parseDouble(inputs[i]);
    values[i-2] = valueDouble;
    }
return values;
}

public void driver(){
    String option = getOption()[0];
    while (!"quit".equals(option)){
    switch (option) {
        case "add": if (options.length < 2){
                        break;
                    }
                    else{
                        dataMap.put(options[1], getValues(options));
                    }
                    //System.out.println(dataMap.isEmpty());
                    //System.out.println(Arrays.toString(getValues()));
                    break;
        case "quit": return;
    }
    option = getOption()[0];
    }
}
public static void main(String[] args) {
    StatsAgain sa = new StatsAgain();
    sa.driver();
}
}

让我知道您能做什么。 基本上,用户输入一个细分为单词数组的字符串。 单词数组被传递到switch语句,该语句检查数组的第一个单词以弄清楚用户想要做什么。 如果他们写“ add”,则应该运行getValues()方法并将返回值用作添加到地图的值。 getValues()方法绝对是问题所在,当使用getOption()方法中的字符串数组时,它不返回任何内容。 我希望这是有道理的...

编辑:忘了提! 当我注释掉地图中“ add”案例的添加部分,而只是使用println getValues()返回(应为double数组)时, 如果两次调用add案例,它就可以工作。 例如,如果我执行“ add abc 1 2 3 4”,则什么也不会发生,但是再次运行完全相同的行将正确返回[1.0,2.0,3.0,4.0]。

根据提供的描述,我相信意外行为的原因是多次调用getOption()方法。 让我们分析一下driver()方法:

  • String option = getOption()[0]; 将用户输入的第一个单词分配给选项字符串。
  • 如果第一个单词是'add',那么它将进入switch的'add'情况并执行dataMap.put(getOption()[1], getValues()); 操作。

在以上两个步骤中, getOption()方法被调用了两次。 每次读取用户输入时,用户为第一个呼叫提供的输入字符串都会丢失(第一个令牌除外)。 相反,我们应该编写两种方法,一种方法是读取用户的输入,另一种方法是将其标记化,然后,我们可以在switch使用tokenizer方法返回的数组。

因此,您应该做的是读取一次(System.in)输入,然后将String数组传递给other方法。

public String[] getOption(){
    String line = new Scanner(System.in).nextLine();
    return line.split(" ");
}

...

String[] inputs = getOption();

...

case "add": dataMap.put(inputs[1], getValues(inputs));
....    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM