2012-12-10 41 views
1

我有一個外部的文本文件,該文件是:拆分這個字符串?

-To Kill a Mockingbird by Harper Lee. 
-The Great Gatsby by Scott Fitzgerald. 
-Hamlet by William Shakespeare. 
-Then Catch in the Rye by J.D Salinger. 
-One Hundred Years of Solitude by Gabriel Garcia Marquez. 
-The Hobbit by J.R.R Tolkien. 
-Moby Dick by Herman Melville. 
-A Tale of two Cities by Charles Dickens. 
-Don Quixoteby Miguel de Cervantes. 
-Love in the Time of Cholera by Gabriel Garcia Marquez. 
-Of Mice and Men by John Steinbeck. 
-Fahrenheit 451 by Ray Bradbury. 
-Stranger in a Strange Land by Robert Heinlein. 
-Siddartha by Herman Heese. 
-Atlas Shrugged by Ayn Rand. 
-The Count of Monte Cristo by Alexandre Dumas. 
-The Iliad by Homer. 
-The Odyssey by Homer. 
-A Wrinkle in Time by Madeleine L'Engle. 
-Inferno by Dante Alighieri. 
-Paradise Lost by John Milton. 
-Alice's Adventures in Wonderland by Lewis Carroll. 
-War and Peace by Leo Tolstoy. 
-Frankenstein by Mary Shelley. 
-Romeo and Juliet by William Shakespeare. 
-Exodus by Leon Uris. 
-1984 by George Orwell. 

什麼,我試圖做的是分裂的字符串的每一行,並將其存儲在一個ArrayList的 我只是不知道爲什麼它從第一跳行至第三行讀取時,該文本文件: 我的代碼:

bookSearch = new Scanner(new FileInputStream("src/booksNames.txt")).useDelimiter(" by "); 
      books = new ArrayList<Books>(); 
      String storeName = ""; 
      String storeAuthor = ""; 

      while(bookSearch.hasNextLine()) 
      { 

       storeName = bookSearch.next().split("by")[0]; 
       storeAuthor = bookSearch.next().split("(by)|(\\.)")[0]; 

       bookSearch.nextLine();    

       info = new Books(storeName, storeAuthor); 
       books.add(info); 
      } 

我所得到的是殺死一隻小八哥由哈珀·李,然後由威廉·莎士比亞跳轉至哈姆雷特!它只是不斷忽略第二,第四,第六行,etcc ..... 任何幫助將不勝感激!

每一個標題和作者是一個獨立的行!

回答

3

你叫bookSearch.next()內loop.bookSearch.nextLine兩次()每次跳到下一個對象。

while(bookSearch.hasNextLine()) 
      { 

       storeName = bookSearch.next().split("by")[0]; 
       storeAuthor = bookSearch.next().split("(by)|(\\.)")[0]; // The error lies here, bookSearch.next() skips to the next object every time 

       bookSearch.nextLine();    

       info = new Books(storeName, storeAuthor); 
       books.add(info); 
      } 

正確實施:

while(bookSearch.hasNextLine()) 
      { 
       String bookString = bookSearch.nextLine(); 
       storeName = bookString.split("by")[0]; 
       storeAuthor = bookString.split("by")[1]; 

       info = new Books(storeName, storeAuthor); 
       books.add(info); 
      } 
+0

現在,我的storeAuthor存儲與storeName相同的信息,它是標題!它一直行,但storeAuthor引用標題而不是作者!會發生什麼問題? – jv0006

+0

在索引1處使用拆分的字符串。author = bookString.split(「by」)[1];但是,您可能必須刪除尾隨的「。」。 – Rahul

+0

謝謝你!你已經幫了很多!我還沒有弄清楚我的錯誤是什麼!我現在沒有想法,我敢打賭這只是一個愚蠢的錯誤! – jv0006

1

你叫內循環bookSearch.next()兩次,bookSearch.nextLine()一次。

查找並返回來自此掃描器的下一個完整標記。完整的令牌前後有與分隔符模式匹配的輸入。即使先前調用hasNext()返回true,該方法也可能在等待輸入進行掃描時阻塞。

while(bookSearch.hasNextLine()) 
{ 
     String[] book = bookSearch.next(); 
     storeName = book.split("by")[0]; 
     storeAuthor = book.split("(by)|(\\.)")[1]; 
     info = new Books(storeName, storeAuthor); 
     books.add(info); 
} 
+0

bookSearch.next()將返回一個字符串,而不是書籍對象 – Rahul

+0

感謝您的注意... :) –

+0

@喬伊現在,我的storeAuthor存儲相同的信息,作爲storeName這是標題!它一直行,但storeAuthor引用標題而不是作者!會發生什麼問題? – jv0006

2

這是因爲你在while循環調用bookSearch.next()兩次

0

使用這樣的事情

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

     while((str=br.readLine()) != null){ 
     strBuf.append(str); 
       //here you can add the str to your arrayList 

     } 
     }catch(Exception e){ 

     } 

這裏Test.txt的是你的輸入文件。這個代碼段會通過線數據

從文本文件讀取行。

希望這是你要找的

0

您可以使用下面的代碼讀取文件。你也應該考慮以下事項。

  • 您應該首先檢查它是否包含「by」關鍵字,因爲有一行不包含「by」,如「Don Quixoteby Miguel de Cervantes」。
  • 你應該使用分裂之間的空間「由」關鍵字,因爲自從「蓋茨比」,也包含「由」它也將拆分此,給你錯誤的結果。

    public void readFile(String fileName) { 
    DataInputStream in = null; 
    try { 
        in = new DataInputStream(new FileInputStream(new File(fileName))); 
        BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
    
        String line; 
        while ((line = br.readLine()) != null) { 
         if (line.contains(" by ")) { 
          String[] arr = line.split(" by "); 
          String book = arr[0]; 
          String author = arr[1]; 
    
          System.out.println("Book : " + book + " Author : " + author + "\n"); 
          System.out.println("\n"); 
         } else { 
          System.out.println(line + "\n"); 
         } 
        } 
    } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } finally { 
        if (in != null) { 
         try { 
          in.close(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    } 
    
+0

讀取文件,但不分割線條。 – Makoto

+0

更新了我的代碼並添加了拆分代碼。 –

0

你約90%存在。其中一個要注意的事情是什麼String.split()回報 - 它給你回的String數組,你正確地指出。但是,如果您爲閱讀的每行創建數組,並且以這種方式執行處理,則會更好。

此外,你打電話next()兩次。回想一下Scanner.next()實際上做了什麼 - 最好的方法是創建局部變量來保存String或拆分String[]

+0

我只是不知道這個代碼有什麼問題!我正在用eclipse調試它,我只是沒有得到期望的結果!我已經嘗試了一切!我敢打賭這是個愚蠢的錯誤! – jv0006

+0

休息一下,重新閱讀這裏的答案。 'Scanner.next()'有兩個不同的常見主題。 – Makoto