2014-04-03 20 views
0

在這裏,我試圖閱讀一個文字,有文字和相應的縮寫。例如。有人可以幫助我使緩衝閱讀器在Java中工作嗎?

one,1 
two,2 
easy,ez 

每一行都是分開的,單詞與縮寫之間用逗號隔開。


當我想緩衝的讀者繼續閱讀使用行

while ((line = br.readLine()) != null) 

不會。它只會讀第一行。這意味着它將顯示一個的縮寫,即1。但是,如果我輸入另一個值,例如兩個,我會收到此錯誤消息。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5 
    at java.lang.String.charAt(String.java:658) 
    at shortener.NewClass.Short(NewClass.java:41) 
    at shortener.NewClass.main(NewClass.java:26) 
Java Result: 

這裏的代碼

public static String Short(String input) { 

    try { 
     FileReader fr = new FileReader("abbreviations.txt"); 
     BufferedReader br = new BufferedReader(fr); 

     String line; 
     while ((line = br.readLine()) != null) { 

      for(int i = 0; i <= line.length(); i++) { 
       if(line.charAt(i) == ','){ 
        String strOrig = line.substring(0, i); 
        if(strOrig.equals(input)) { 
         String strAbv = line.substring(line.length()-1); 
         return strAbv; 
         } 
        }     
       } 
      } 
     br.close(); 
     } catch (IOException e) { 
     out.println("File Not found"); 
    } 
    return null; 
} 

回答

0

所做的條件表達式中for環路我小於或等於line.length()較小。這是錯誤的。 i不應該等於線的長度。改變這種

for(int i = 0; i <= line.length(); i++) 

for(int i = 0; i < line.length(); i++) 

你不能讓i等於線的長度。該指數從0開始。所以,有效的指標是從0length-1

+0

感謝它現在的作品:) –

+0

很高興,它的工作:) – Keerthivasan

1

這是不正確的:

for(int i = 0; i <= line.length(); i++) { 

,因爲它是訪問一個太多。要更正:

for(int i = 0; i < line.length(); i++) { 

請注意,發佈的代碼不會close()讀者如果找到縮寫。使用finally區塊或try-with-resources聲明使讀者關閉。

其他:

  • String.split()可用於線分成兩個令牌代替顯式編碼的分離。
  • A Properties樣式文件可用於存儲縮略語地圖而不是逗號分隔文件。該Properties類提供了一種機制,用於加載文件和方法用於搜索地圖:

    // If the 'abbreviations.txt' file is not updated 
        // by the program then arrange for it to be loaded once. 
        // 
        try (final FileInputStream is = 
          new FileInputStream("abbreviations.txt")) 
        { 
         final Properties p = new Properties(); 
         p.load(is); 
         return p.getProperty(input); 
        } 
    
+0

建議使用'.split()'。可能舉一個例子來說明如何使用它來更好地完成這個過程? – JonK

0

退房代碼的for環路部分:

for(int i = 0; i <= line.length(); i++) { 

應改爲此:

for(int i = 0; i < line.length(); i++) { 

通知<=是如何變爲<

for(int i = 0; i <= line.length(); i++) { 
//vs: 
for(int i = 0; i < line.length(); i++) { 

對於幾乎所有的編碼,包括java,從0開始計數那麼,你通常會說5,在編碼你會說4

假設數組的長度3,這意味着它包含0,12。現在

for(int i = 0; i <= line.length(); i++) { 
//length of the line is 3, so: 
for(int i = 0; i <= 3; i++) { 

,它會循環扔數字0123:那麼,在做這個的時候。然而,該行僅包含0,12。所以,如果我們做到這一點:

for(int i = 0; i < line.length(); i++) { 
//length of the line is 3, so: 
for(int i = 0; i < 3; i++) { 

使用這個新的代碼,它會循環扔01,並且2,我們的產品線的長度相同,012

相關問題