我的算法类的第一个分配是我必须创建一个程序,从提供的csv文件中读取一系列书名,对它们进行排序,然后将它们打印出来。赋值具有非常具体的参数,其中之一就是我必须创建一个静态List getList(String file)方法。该方法的具体内容如下:
" getList方法应该读取csv中的数据 file book.csv。如果一条线不遵循该模式 标题,作者,年份然后应该写一条消息 到标准错误流(见示例输出) 程序应继续阅读下一行。没有 应抛出异常。"
我对使用List,ArrayList或读取文件没有太多经验,所以你可以猜测这对我来说非常困难。以下是我到目前为止的方法:
public static List<Book> getList(String file)
{
List<Book> list = new ArrayList<Book>();
return list;
}
目前,我最好的猜测是使用i作为索引进行for循环并将新的Book对象实例化到List中,但是我不知道设置循环有多高,因为我没有&#39;有任何方法告诉程序,例如,csv中有多行。我也不知道如何让它在csv中区分每本书的标题,作者和年份。
抱歉这个冗长的问题。我很感激任何帮助。感谢。
答案 0 :(得分:2)
执行此操作的最佳方法是逐行读取文件,并检查行的格式是否正确。如果正确,请将新对象添加到列表中,并在行中显示详细信息,否则请写入错误消息并继续。
您可以使用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"]
。
现在您拥有该行的值,但您需要验证它的格式是否正确。由于你的帖子指定它应该有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
}
最后,因为我们已经阅读并验证了我们需要的信息,并且格式正确。我们可以创建一个新对象并将其添加到列表中。我们将使用Integer
中内置的Java
包装器将年份解析为int
类构造函数的原始Book
类型。 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
使用上面的main方法,getList函数和文件,我的代码生成器输出如下(注意:Std.err流的错误消息为红色,SO不显示颜色):
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]
如果您对其中的任何部分感到困惑,请随时提出问题。显示的输出来自我在toString()
类上编写的Book
方法,我用它来测试代码中的代码。
答案 1 :(得分:0)
您可以使用do while循环并将其读取到文件末尾。每个新行都代表一个Book Object详细信息。 在csv中,所有细节都以逗号分隔,因此您可以读取字符串,每个逗号将充当Book属性之间的分隔符。