2013-11-15 113 views
0

我寫將會從文件中讀取一個字符串,然後刪除任何不是1-9或A-Z或A-Z的程序。 A-Z值需要變成小寫。一切似乎運行良好,我沒有任何錯誤,但是我的輸出是混亂的。無論如何,它似乎都會跳過某些字符。我已經看過並調整它,但沒有任何作用。無法弄清楚爲什麼它會隨機跳過某些字符,因爲我相信我的if語句是正確的。下面是代碼:字符串不填充正確

String dataIn; 
    int temp; 
    String newstring= ""; 
    BufferedReader file = new BufferedReader(new FileReader("palDataIn.txt")); 
    while((dataIn=file.readLine())!=null) 
     { 
     newstring=""; 
     for(int i=0;i<dataIn.length();i++) 
      { 
      temp=(int)dataIn.charAt(i); 
      if(temp>46&&temp<58) 
       { 
       newstring=newstring+dataIn.charAt(i); 
       } 
      if(temp>96&&temp<123) 
       { 
       newstring=newstring+dataIn.charAt(i); 
       } 
      if(temp>64&&temp<91) 
       { 
       newstring=newstring+Character.toLowerCase(dataIn.charAt(i)); 
       } 
      i++; 
      } 
     System.out.println(newstring); 
     } 

所以給你一個例子,我讀出第一串是:

A sample line this is. 

我的程序後,該輸出貫穿它是這樣的:

asmlietis 

所以它是讀取A使其小寫,跳過像它想的空間,讀入S,但後來由於某些原因跳過了「A」和「m」和轉移到「p」。

回答

4

在主環路「標題」中,您在以及的每個塊中都增加了i。事實上,因爲你已經有了在else聲明一個i++;最後if聲明,你有時會在循環過程遞增i兩次。

剛剛擺脫一個比在for聲明聲明之外的所有的i++;語句。例如:

newstring=""; 
for(int i=0;i<dataIn.length();i++) 
{ 
    temp=(int)dataIn.charAt(i); 
    if(temp>46&&temp<58) 
    { 
     newstring=newstring+dataIn.charAt(i); 
    } 
    if(temp>96&&temp<123) 
    { 
     newstring=newstring+dataIn.charAt(i); 
    } 
    if(temp>64&&temp<91) 
    { 
     newstring=newstring+Character.toLowerCase(dataIn.charAt(i)); 
    } 
} 

雖然我不會停止編輯。我也想:

  • 使用char代替int爲本地變量你看
  • 使用字符文字的對比當前字符,使之更清楚這是怎麼回事
  • 使用StringBuilder建立字符串
  • 聲明變量爲輸出字符串迴路中的電流線
  • 使用if/else if要清楚你在LY希望能進一個分支
  • 合併兩個路徑,這兩個附加的字符作爲,是
  • 修正了數字的條件(這是不正確的時刻)
  • 使用清晰多個空白
  • toLower指定一個區域,以避免 「土耳其問題」 與我

所以:

String line; 
while((line = file.readLine()) != null) 
{ 
    StringBuilder builder = new StringBuilder(line.length()); 
    for (int i = 0; i < line.length(); i++) { 
     char current = line.charAt(i); 
     // Are you sure you want to trim 0? 
     if ((current >= '1' && current <= '9') || 
      (current >= 'a' && current <= 'z')) { 
      builder.append(current); 
     } else if (current >= 'A' && current <= 'Z') { 
      builder.append(Character.toLowerCase(current, Locale.US)); 
     } 
    } 
    System.out.println(builder); 
} 
+0

我這樣做了,但現在我的輸出是'asmlietis',所以它仍然在跳過字符。 – Student

+0

@Student - 你還沒有刪除最後一個'i ++'。 –

+0

謝謝,我不知道爲什麼我一直希望在for語句中增加它,應該已經意識到它本身在做它。 – Student