我有一个外部文本文件:
-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);
}
我得到的是由Harper Lee杀死一只嘲笑鸟,然后由William Shakespeare跳到哈姆雷特!它只是忽略了第二,第四,第六行等等..... 任何帮助将不胜感激!!
每个标题和作者都是一个单独的行!
答案 0 :(得分:3)
你在loop.bookSearch.nextLine()里面两次调用bookSearch.next(),每次都跳到下一个对象。
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);
}
答案 1 :(得分:2)
这是因为您在bookSearch.next()
循环
while
答案 2 :(得分: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);
}
答案 3 :(得分: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是您的输入文件。此代码段将逐行获取
来自文本文件。
希望这就是你要找的东西
答案 4 :(得分:0)
您可以使用以下代码来读取文件。您还应该考虑以下事项。
你应该使用“by”关键字之间的空格进行拆分,因为“Gatsby”也包含“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();
}
}
}
}
答案 5 :(得分:0)
那里你大概有90%。需要注意的一点是String.split()
返回的内容 - 它会返回一个String
数组,您可以正确记录它。但是,如果您为正在阅读的每一行创建数组并以此方式执行处理,那么您将获得更好的服务。
此外,您正在拨打next()
两次。回想一下Scanner.next()
实际上做了什么 - 最好是创建局部变量来保存String
或分割String[]
。