2013-03-07 60 views
0

我在do-while循環成功將整數更改爲if語句內的值時遇到了問題。它會正確地退出循環,如果我輸入「Ÿ」或「ñ」,但整數的值將保持在0將值添加到do-while循環中的整數

我使用子允許用戶輸入類似「 「或」 」,甚至是 「Y3 $ IR」,仍然等同於 'Ÿ' 到Java。

代碼:

import java.util.Scanner; 
public class aTaskforAll 
{ 
    public static void main (String [] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     String readAll; 

     int readAllOption = 0; 

     do { 
      System.out.print("Do you want the words printed? (y/n) "); 
      readAll = scan.nextLine(); 
      System.out.println(readAll.substring(0)); 

      if ((readAll.substring(0) == "y") || (readAll.substring(0) == "Y")) 
       readAllOption = 1; 
      else if ((readAll.substring(0) == "n") || (readAll.substring(0) == "N")) 
       readAllOption = 2; 
     } 
     while (readAllOption != 0); 

     System.out.println(readAllOption); //Tester 

     //Go on to do task in response to readAllOption = 1 or 2 
    } 
} 

回答

1

String.substring(int)方法不會做你認爲它。

以下是文件說什麼:

返回一個新字符串,它是此字符串的一個子。子字符串以指定索引處的字符開頭,並延伸到此字符串的末尾。

因此,readAll.substring(0)會給你一個子字符串,它將基本上包含原始字符串中的所有字符。

您的使用案例的正確方法是String.substring(int,int)

從文檔

返回一個新字符串,它是此字符串的一個子。子字符串從指定的beginIndex開始,並擴展到索引endIndex - 1處的字符。因此,子字符串的長度是endIndex-beginIndex。

因此,readAll.substring(0, 1)會給你一個只有第一個字符的子字符串。

或者,它甚至會更好(清潔劑)使用String.startsWith(String)方法

if (readAll.startsWith("y") || readAll.startsWith("Y")) 
    //... 

的另一個問題是,使用==的對象(在你的案件串)平等檢查:

//... 
if ((readAll.substring(0) == "y") || (readAll.substring(0) == "Y")) 
//... 
else if ((readAll.substring(0) == "n") || (readAll.substring(0) == "N")) 
//... 

請勿使用==,而應使用.equals方法代替平等檢查。 ==是用於身份檢查,這意味着只需比較參考。


此外,你應該在每次迭代開始時復位的readAllOption值:

do { 
    readAllOption = 0; 

退出循環。

+1

-1 readAll.substring(0)什麼都不做。它返回整個String。 – user949300 2013-03-07 06:18:25

+1

我喜歡使用.startsWith來處理這種情況。謝謝! – 2013-03-07 06:42:09

+0

@PejmonHodaee:不客氣。 – 2013-03-07 06:42:52

1

首先,您的終止條件是向後的。

你想

do { 
    stuff... 
} 
while (readAllOption == 0) 

書面,當readAllOption == 0, 而你需要它在每個循環的開始設置爲0,它只會退出循環。

其次,readAll.subString(0)返回整個String。你想要readAll.charAt(0),並將其與字符'Y'或'N'進行比較。

我不知道這段代碼是如何遠程爲你工作的。

+0

非常感謝,謝謝! – 2013-03-07 06:43:56

+0

很高興能夠幫助您,並在您的編程中祝好運! – user949300 2013-03-07 07:29:01

1

對於字符串,您需要使用.equals("y")而不是==,並且您沒有子字符串的結束索引。 所以這樣

if (readAll.substring(0, 1).equals("y")){} 

正如Bhesh古隆說

此外,你應該在每次迭代開始時復位readAllOption的價值:

做{ readAllOption = 0;

也爲用戶user949300說

你的終止條件是倒退。

你想

做{ 的東西... } 而(readAllOption == 0) 作爲寫的,它只會退出循環時readAllOption == 0

+0

@Bhesh Gurung只是打敗了我 – Breavyn 2013-03-07 06:13:56

+0

哈哈,謝謝你!我確實使用你的想法來結束循環。 – 2013-03-07 06:43:35

1

使用.equals()而不是比較字符串時的==

剛開的第一個字符也將工作(這將是更有效):

readAll.charAt(0) == 'y'

+0

+1 for charAt()。 -1表示它更高效。問題是,readAllOption.subString(0)完全錯誤... – user949300 2013-03-07 06:20:41

+0

@ user949300:感謝您的輸入。它如何不是更有效率? 'subString()'創建一個新的字符串對象,而'charAt()'是一個返回char的常量操作。 – 2013-03-07 06:28:27

+0

除非他每秒100000次循環調用它,否則無關緊要。 (但是,基本上你錯過了關注效率的錯誤) – user949300 2013-03-07 06:30:32

0

讓這樣的代碼。保持它的完整性。

import java.util.Scanner; 
public class aTaskforAll 
    { 
    public static void main (String [] args) 
    { 
    Scanner scan = new Scanner(System.in); 
    String readAll; 

    int readAllOption = 0; 

    do { 
     System.out.print("Do you want the words printed? (y/n) "); 
     readAll = scan.nextLine(); 
     System.out.println(readAll.substring(0)); 

     if ("y".equals(readAll.substring(0,1).toLowerCase()) 
      readAllOption = 1; 
     else if ("n".equals(readAll.substring(0,1).toLowerCase()) 
      readAllOption = 2; 
     } 
    while (readAllOption != 0); 

    System.out.println(readAllOption); //Tester 

    //Go on to do task in response to readAllOption = 1 or 2 
    } 
} 
相關問題