我是Java新手所以请耐心等待。
我需要再次为我的一项任务提供帮助。现在它涉及FileI / O.
我必须完成的任务是:
我必须阅读.csv文件。文件中的值为:
Christopher Lee,54.0
Stanley Wright,90.5
Oliver Stewart,75.8
Jessica Chang,34.65
正如任务所说,我必须将文件中的内容存储到两个数组中。一个用于名称,一个用于测试标记。我应该至少读取文件两次,一次检查文件中有多少名称,再多几次实际读取文件(获取名称和标记)。所以基本上,我应该有一个数组来存储名称作为字符串,以及一个数组来存储学生的标记作为实数。
我应该排列数组(例如学生[0]应该存储第一个学生的名字,而标记[0]应该存储第一个学生的标记
将.csv文件的内容存储到数组后,我必须向用户显示以下菜单。如果用户按下1,则应提示用户输入学生的姓名。如果用户按下2,程序应该退出。如果名称存在,则应显示输入的学生的测试标记。如果学生不存在,那么我必须向用户输出一条信息,但程序不应该结束,而是返回上面的菜单。
到目前为止,这是我的代码:
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String fileName = "file:///Documents/Java/marks_file.csv"; // Opens the file
String[] arrayString = new String[6]; // String length inside the file
int numLines, selection = 0;
double[] arrayReal = new double[6]; // Number length inside the file
numLines = getNumLines(fileName); // Gets the length of the file
readFile(arrayString, arrayReal, fileName);
// Selection menu
do
{
System.out.println("Select an option:");
System.out.println("1. Display mark");
System.out.println("2. Exit");
selection = sc.nextInt();
if (selection == 1)
{
System.out.println("Enter your full name");
{
// Do something
}
}
else if (selection == 2)
{
System.out.println("Goodbye");
}
}
while (selection == 1);
//System.out.println("Number of arrays: " + numLines);
}
// Method to get the length of the .csv file
public static int getNumLines(String fileName)
{
FileInputStream fileStrm = null;
InputStreamReader rdr;
BufferedReader bufRdr;
String line;
int lineNum = 0;
try
{
fileStrm = new FileInputStream(fileName);
rdr = new InputStreamReader(fileStrm);
bufRdr = new BufferedReader(rdr);
line = bufRdr.readLine();
while (line != null)
{
lineNum = lineNum + 1;
line = bufRdr.readLine();
}
fileStrm.close();
}
catch (IOException e)
{
try
{
if (fileStrm != null)
{
fileStrm.close();
}
}
catch (IOException ex2)
{
// Nothing to do
}
System.out.println("Error in file processing: " + e.getMessage());
}
return lineNum;
}
// Method to store the values to arrays
public static void readFile(String[] arrayString, double[] arrayReal, String fileName)
{
Scanner sc = new Scanner(System.in);
FileInputStream fileStrm = null;
InputStreamReader rdr;
BufferedReader bufRdr;
String line;
try
{
fileStrm = new FileInputStream(fileName);
rdr = new InputStreamReader(fileStrm);
bufRdr = new BufferedReader(rdr);
for (int i = 0; i < arrayString.length; i++)
{
line = bufRdr.readLine();
arrayString[i] = processString(line);
arrayReal[i] = processReal(line);
}
}
catch (IOException e)
{
try
{
if (fileStrm != null)
{
fileStrm.close();
}
}
catch (IOException ex2)
{
// Nothing to do
}
System.out.println("Error in file processing: " + e.getMessage());
}
}
// Stores the String lines to array
public static String processString(String line)
{
String string;
String[] lineArray = line.split(",");
return string = lineArray[0];
}
// Stores real number lines to array
public static double processReal(String line)
{
double real;
String[] lineArray = line.split(",");
return real = Double.parseDouble(lineArray[1]);
}
到目前为止,我完成了#34;阅读文件&#34;部分并将.csv文件中的内容处理为数组。
我不太确定如何提示用户从.csv文件中搜索字符串数组。我试着查看其他来源,即使在这个网站上,但我根本没有运气。我尝试了Scanner.next()方法,但这根本不起作用。也许我只是错过了什么。另外,我不确定我是否做了两次&#34;读取文件&#34;对。
我是否在正确的轨道上?我需要一些指导
答案 0 :(得分:0)
我宁愿告诉您将数据传递给通用的arraylist,然后使用get()方法查询结果,而不是存储到数组中。
答案 1 :(得分:0)
你使事情变得简单。
只需使用名称作为键的HashMap和测试得分作为值。
答案 2 :(得分:0)
首先,我想说我会使用Map而不是两个数组,但我会向您展示使用两个数组的解决方案。
你接近解决方案。你遇到的一个问题是 scanner.next()只读取输入直到第一个空格。这就是你需要使用 scanner.nextLine()的原因。此方法读取完整的行。代码可能看起来像这样:
Scanner sc = new Scanner(System.in);
System.out.print("Please enter name of student: ");
String name = sc.nextLine();
for(int i = 0; i < arrayString.length; i++){
if(name.equals(arrayString[i])) {
System.out.println(arrayReal[i]);
}
}
初始化HashMap
HashMap<String, Double> hm = new HashMap<String, Double>();
填写HashMap
hm.put("Christopher Lee", 54.0);
打印学生的双倍值
System.out.print("Please enter name of student: ");
String name = sc.nextLine();
System.out.println(hm.get(name));