使用 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() 方法,我用它来测试答案中的代码。