2016-03-05 71 views
0

我有一个中等简单的程序,我遇到了问题。它应该接受用户输入,按空格拆分该行并将单个字作为字符串转储为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()方法中的字符串数组时,它不会返回任何内容。我希望这是有道理的...

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

回答

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)); 
....  
0

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

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

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

+0

对不起,如果这不清楚!用户输入“add ”,所以我从2开始。编辑主帖澄清。 – Qdhcjv

+0

我编辑了我的答案。希望能帮助到你。 –

+0

谨慎阐述标记化?恐怕我不明白那是什么。 – Qdhcjv

相关问题