- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的算法课的第一个作业是我必须创建一个程序,从提供的 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 作为索引将一个新的 Book 对象实例化到列表中,但我不知道将循环设置多高,因为我没有任何方法告诉程序 csv 中有多少行。我也不知道如何让它区分 csv 中每本书的标题、作者和年份。
很抱歉问了一个冗长的问题。我将不胜感激任何帮助。谢谢。
最佳答案
执行此操作的最佳方法是逐行读取文件,并检查行的格式是否正确。如果正确,请将新对象添加到列表中,并在行中添加详细信息,否则写下错误消息并继续。
您可以使用 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 流的错误消息为红色,因此不显示颜色):
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
上的方法我用于测试答案中的代码的类。
关于java - 使用 csv 文件作为输入参数创建 getList 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053593/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!