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.

私がやろうとしているのは、各行の文字列を分割して配列リストに保存することです。このテキスト ファイルを読み取るときに、なぜ最初の行から 3 行目にジャンプするのかわかりません: 私のコード:

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);
            }

私が得たのは、Harper Lee の To Kill a Mocking Bird で、William Shakespeare の Hamlet にジャンプします。2行目、4行目、6行目などを無視し続けるだけです.....助けていただければ幸いです!!

すべてのタイトルと著者は別の行です!

4

6 に答える 6

3

loop.bookSearch.nextLine() 内で bookSearch.next() を 2 回呼び出しましたが、毎回次のオブジェクトにスキップします。

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);
            }
于 2012-12-10T07:19:54.720 に答える
2

これは、ループ内bookSearch.next()で 2 回呼び出すために発生しますwhile

于 2012-12-10T07:20:08.527 に答える
1

bookSearch.next()ループ内で 2 回、 1 回呼び出し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);
}
于 2012-12-10T07:20:05.113 に答える
0

あなたはそこに約90%います。注意すべき点の1つは、何String.split()が返されるかです。これにより、の配列が返さStringれます。これは正しく注意してください。ただし、読み取っている行ごとに配列を作成し、その方法で処理を実行すると、はるかに優れたサービスが提供されます。

また、next()2回電話をかけています。実際に何をしているのかを思い出してください。またはsplitScanner.next()のいずれかを保持するローカル変数を作成するのが最適です。StringString[]

于 2012-12-10T07:31:27.573 に答える
0

次のコードを使用してファイルを読み取ることができます。また、次のことも考慮する必要があります。

  • 「Don Quixoteby Miguel de Cervantes.」のように「by」が含まれていない行があるため、「by」キーワードが含まれているかどうかを最初に確認する必要があります。
  • 「Gatsby」にも「by」が含まれているため、これも分割され、間違った結果が得られるため、「 by 」キーワードの間のスペースを使用して分割する必要があります。

    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();
            }
        }
    }
    }
    
于 2012-12-10T07:26:33.633 に答える
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 は入力ファイルです。このコード スニペットは、行ごとのデータを取得します。

テキストファイルから。

これがあなたが探していたものであることを願っています

于 2012-12-10T07:20:16.110 に答える