2016-03-04 62 views
1

我有兩個方法,getOption()driver()循環就不會結束。開關,而當告訴

getOption()帶String從掃描儀,打破它爲單個單詞,並返回字符串的數組。

driver()然後獲取該數組的第一個值getOption()[0],並基於該第一個String開始一個while循環。雖然字符串不等於「退出」,請檢查該值是否與任何開關情況匹配。但是,當我運行它時,它可以執行任何切換情況,但quit語句從不起作用。任何人都可以幫我一把嗎?

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

public void driver(){ 
    String option = getOption()[0]; 
    Stats s = new Stats(data); 
    while (!"quit".equals(option)){ 
    switch (option) { 
     case "add": //data.put(getOption()[1], getValues()); 
        System.out.println("add"); 
        break; 
     case "set": System.out.println("set"); 
        break; 
     case "print": System.out.println(Arrays.toString(data)); 
         break; 
     case "sum": System.out.println(s.sum()); 
        break; 
     case "mean": System.out.println(s.mean()); 
        break; 
     case "stdev": System.out.println(s.standardDeviation()); 
         break; 
     case "median": System.out.println(s.median()); 
         break; 
     case "primes": System.out.println(s.primes()); 
         break; 
     case "summary": System.out.println("summary"); 
         break; 
      //case "test": System.out.println(Arrays.toString(getValues())); 
    } 
    driver(); 
    } 
} 

回答

4

你在你的while循環結束遞歸調用方法driver();

如果你讀getOption與否,你還是回來了裏面的方法不管......

這就是原因所在的顯然沒有工作,而條件...

一個非常不尋常的陷阱。

+0

我很缺乏經驗,這是一項任務。你建議我做什麼呢?我很抱歉如此失落:( – Qdhcjv

+0

在結束的時候再次移除對driver()的調用,而是再次讀取option = getOption()[0];並且s = new Stats(data); –

1

一旦進入While循環,您永遠不會更改選項的值。你可以改變你,而要

while (true){ 
option = getOption()[0]; 
Stats s = new Stats(data); 
    switch (option) { 
    case "add": //data.put(getOption()[1], getValues()); 
       System.out.println("add"); 
       break; 
    case "set": System.out.println("set"); 
       break; 
    case "print": System.out.println(Arrays.toString(data)); 
        break; 
    case "sum": System.out.println(s.sum()); 
       break; 
    case "mean": System.out.println(s.mean()); 
       break; 
    case "stdev": System.out.println(s.standardDeviation()); 
        break; 
    case "median": System.out.println(s.median()); 
        break; 
    case "primes": System.out.println(s.primes()); 
        break; 
    case "summary": System.out.println("summary"); 
        break; 
     //case "test": System.out.println(Arrays.toString(getValues())); 
    case "quit": break; 

    } 
} 

注意,如果你用我的答案,你需要將不再遞歸調用driver()

+0

我擔心,這不會幫助,因爲他進入了一個新while循環的遞歸'驅動程序()'調用 – schwobaseggl

+0

好吧,我換成getOption(選項)[0],我感謝您的建議。我也用getOption()[0]替換了switch語句中的選項。現在我的開關語句中只有少數能夠工作,但如果我將其寫兩次,退出工作......任何解釋?我覺得我錯過了很大的東西。 – Qdhcjv

+0

非常真實,我已經更新了我的答案以適應。 –

0

您似乎沒有在任何地方改變option值。你遞歸地調用driver(),但這並不影響當前正在執行的方法中保持不變的局部變量。

因此,一個driver()方法調用另一個方法,該方法創建自己的option變量,與調用方的option變量無關。基本上,只有最內層的呼叫driver()將永遠返回,你將被卡在呼叫者的while循環中。

擺脫遞歸的,這是不必要的。根據switch只需撥打getOption()並更新option的值。

while (!"quit".equals(option)){ 
    // switch statement 

    option = getOption()[0];  
} 
+0

看起來沒錯...如果我在循環開始的下面定義了選項,while循環找不到它 – Qdhcjv

+0

我剛剛粘貼了一個片段,你可以看到這裏沒有聲明選項,只是指定了。 ,在while循環之上。 – Filkolev