用户输入 - >字符串数组 - >铸造双打不起作用

时间:2016-03-05 23:39:51

标签: java arrays string for-loop dictionary

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

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()方法并使用return作为添加到地图的值。 getValues()方法肯定是个问题,当它使用getOption()方法中的字符串数组时,它不会返回任何内容。我希望这是有道理的......

编辑:忘了提!当我注释掉地图添加“添加”案例的一部分,而只是打印getValues()返回(应该是双数组),它工作如果我调用添加案例两次即可。例如,如果我“添加abc 1 2 3 4”,则没有任何反应,但再次运行完全相同的行将正确返回[1.0,2.0,3.0,4.0]。

2 个答案:

答案 0 :(得分:0)

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

  • String option = getOption()[0];将用户输入的第一个单词分配给选项字符串。
  • 如果第一个字是&#39;添加&#39;然后,它进入&#39;添加&#39;切换的情况并执行dataMap.put(getOption()[1], getValues());操作。

在上面的两个步骤中,getOption()方法被调用两次。由于每次都读取用户的输入,用户为第一次调用提供的输入字符串会丢失(第一个令牌除外)。我们应该编写两个方法,一个用于读取用户的输入,另一个用于对其进行标记,然后,我们可以使用switch中的tokenizer方法返回的数组。

答案 1 :(得分:0)

所以你应该做的是读取(System.in)输入一次并将String数组转换为其他方法。

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

...

String[] inputs = getOption();

...

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