使用 csv 文件作为输入参数创建 getList 方法
Creating a getList method with a csv file as an input parameter
我的算法的第一个任务 class 是我必须创建一个程序,从提供的 csv 文件中读取一系列书名,对它们进行排序,然后将它们打印出来。赋值有非常具体的参数,其中之一是我必须创建一个静态 List getList(String file) 方法。该方法的具体内容如下:
"getList 方法应该从 csv 中读取数据
文件 book.csv。如果一条线不遵循模式
标题,作者,年份然后应该写一条消息
到标准错误流(见示例输出)
程序应该在下一行继续阅读。不
应该抛出异常。”
我对 List、ArrayList 的使用或读取文件没有太多经验,所以你可以猜到这对我来说很难。到目前为止,这是我所掌握的方法:
public static List<Book> getList(String file)
{
List<Book> list = new ArrayList<Book>();
return list;
}
目前,我最好的猜测是制作一个for循环并使用i作为索引将新书object实例化到列表中,但我不知道将循环设置为多高,因为我没有任何方法可以告诉程序 csv 中有多少行。我也不知道如何让它在 csv 中区分每本书的标题、作者和年份。
抱歉 long-winded 问题。我将不胜感激任何帮助。谢谢
您可以使用 do while 循环并读取它直到文件末尾。每一个新行将代表一个 Book 对象的详细信息。
在 csv 中,所有详细信息均以逗号分隔,因此您可以读取字符串,每个逗号将充当 Book 属性之间的分隔符。
最好的方法是逐行读取文件,并检查该行的格式是否正确。如果正确,请将新对象添加到列表中,并在该行中添加详细信息,否则写下您的错误消息并继续。
您可以使用 BufferedReader
阅读您的文件。他们可以通过执行以下操作逐行阅读:
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
// do something with the line here
}
br.close();
现在您有了这些行,您需要验证它们的格式是否正确。一个简单的方法是用逗号分隔行(因为它是一个 csv 文件),并检查它在数组中至少有 3 个元素。您可以使用 String.split(regex)
方法。
String[] bookDetails = line.split(",");
这将使用您文件中的字段填充数组。例如,如果第一行是 one,two,three
,那么数组就是 ["one","two","three"]
.
现在您有了该行的值,但您需要验证它的格式是否正确。由于您的 post 指定它应该有 3 个字段,我们可以通过检查上面得到的数组的长度来检查这一点。如果长度小于 3,我们应该输出一些错误消息并跳过该行。
if(bookDetails.length<3){ //title,author,year
System.err.println("Some error message here"); // output error msg
continue; // skip this line as the format is corrupted
}
最后,由于我们已经阅读并验证了我们需要的信息,并且格式正确。我们可以创建一个新对象并将其添加到列表中。我们将使用内置于 Java
中的 Integer
包装器将年份解析为原始 int
类型,用于 Book
class 构造函数。 Integer
有一个函数 Integer.parseInt(String s)
可以将 String
解析为 int
值。
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
希望这对您有所帮助,并回答您的问题。我们所做的完整方法如下:
public static List<Book> getList(String file) {
List<Book> list = new ArrayList<Book>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
String[] bookDetails = line.split(",");
if (bookDetails.length < 3) { // title,author,year
System.err.println("Some error message here");
continue;
}
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
如果您想对此进行测试,可以使用以下代码创建 main
方法(我就是这样测试的)。
public static void main(String[] args) {
String file = "books.csv";
List<Book> books = getList(file);
for(Book b : books){
System.out.println(b);
}
}
要测试它,请确保您的 Java
项目的根目录中有一个文件(我的是 "books.csv")。我的看起来像:
bob,jones,1993
bob,dillon,1994
bad,format
good,format,1995
another,good,1992
bad,format2
good,good,1997
使用上面的主要方法、getList 函数和文件,我的代码生成器输出以下内容(注意:Std.err 流的错误消息为红色,因此不显示颜色):
Some error message here
Some error message here
[title=bob, author=jones, years=1993]
[title=bob, author=dillon, years=1994]
[title=good, author=format, years=1995]
[title=another, author=good, years=1992]
[title=good, author=good, years=1997]
如果您对其中的任何部分感到困惑,请随时提问。显示的输出来自我在 Book
class 上编写的 toString()
方法,我用它来测试答案中的代码。
我的算法的第一个任务 class 是我必须创建一个程序,从提供的 csv 文件中读取一系列书名,对它们进行排序,然后将它们打印出来。赋值有非常具体的参数,其中之一是我必须创建一个静态 List getList(String file) 方法。该方法的具体内容如下:
"getList 方法应该从 csv 中读取数据 文件 book.csv。如果一条线不遵循模式 标题,作者,年份然后应该写一条消息 到标准错误流(见示例输出) 程序应该在下一行继续阅读。不 应该抛出异常。”
我对 List、ArrayList 的使用或读取文件没有太多经验,所以你可以猜到这对我来说很难。到目前为止,这是我所掌握的方法:
public static List<Book> getList(String file)
{
List<Book> list = new ArrayList<Book>();
return list;
}
目前,我最好的猜测是制作一个for循环并使用i作为索引将新书object实例化到列表中,但我不知道将循环设置为多高,因为我没有任何方法可以告诉程序 csv 中有多少行。我也不知道如何让它在 csv 中区分每本书的标题、作者和年份。
抱歉 long-winded 问题。我将不胜感激任何帮助。谢谢
您可以使用 do while 循环并读取它直到文件末尾。每一个新行将代表一个 Book 对象的详细信息。 在 csv 中,所有详细信息均以逗号分隔,因此您可以读取字符串,每个逗号将充当 Book 属性之间的分隔符。
最好的方法是逐行读取文件,并检查该行的格式是否正确。如果正确,请将新对象添加到列表中,并在该行中添加详细信息,否则写下您的错误消息并继续。
您可以使用 BufferedReader
阅读您的文件。他们可以通过执行以下操作逐行阅读:
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
// do something with the line here
}
br.close();
现在您有了这些行,您需要验证它们的格式是否正确。一个简单的方法是用逗号分隔行(因为它是一个 csv 文件),并检查它在数组中至少有 3 个元素。您可以使用 String.split(regex)
方法。
String[] bookDetails = line.split(",");
这将使用您文件中的字段填充数组。例如,如果第一行是 one,two,three
,那么数组就是 ["one","two","three"]
.
现在您有了该行的值,但您需要验证它的格式是否正确。由于您的 post 指定它应该有 3 个字段,我们可以通过检查上面得到的数组的长度来检查这一点。如果长度小于 3,我们应该输出一些错误消息并跳过该行。
if(bookDetails.length<3){ //title,author,year
System.err.println("Some error message here"); // output error msg
continue; // skip this line as the format is corrupted
}
最后,由于我们已经阅读并验证了我们需要的信息,并且格式正确。我们可以创建一个新对象并将其添加到列表中。我们将使用内置于 Java
中的 Integer
包装器将年份解析为原始 int
类型,用于 Book
class 构造函数。 Integer
有一个函数 Integer.parseInt(String s)
可以将 String
解析为 int
值。
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
希望这对您有所帮助,并回答您的问题。我们所做的完整方法如下:
public static List<Book> getList(String file) {
List<Book> list = new ArrayList<Book>();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
String[] bookDetails = line.split(",");
if (bookDetails.length < 3) { // title,author,year
System.err.println("Some error message here");
continue;
}
list.add(new Book(bookDetails[0], bookDetails[1], Integer.parseInt(bookDetails[2])));
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
如果您想对此进行测试,可以使用以下代码创建 main
方法(我就是这样测试的)。
public static void main(String[] args) {
String file = "books.csv";
List<Book> books = getList(file);
for(Book b : books){
System.out.println(b);
}
}
要测试它,请确保您的 Java
项目的根目录中有一个文件(我的是 "books.csv")。我的看起来像:
bob,jones,1993
bob,dillon,1994
bad,format
good,format,1995
another,good,1992
bad,format2
good,good,1997
使用上面的主要方法、getList 函数和文件,我的代码生成器输出以下内容(注意:Std.err 流的错误消息为红色,因此不显示颜色):
Some error message here
Some error message here
[title=bob, author=jones, years=1993]
[title=bob, author=dillon, years=1994]
[title=good, author=format, years=1995]
[title=another, author=good, years=1992]
[title=good, author=good, years=1997]
如果您对其中的任何部分感到困惑,请随时提问。显示的输出来自我在 Book
class 上编写的 toString()
方法,我用它来测试答案中的代码。