对于我的家庭作业,我应该创建一个ATM / Teller程序,用于将用户帐户存储在文本文件中。我需要帮助阅读文本文件并将其中的某些部分存储在数组列表中。
import java.io.*;
import java.util.Scanner;
import java.io.FileInputStream;
import java.io.BufferedReader;
public class GetData
{
public static void main(String[] args)
{
BufferedReader in = new BufferedReader(new FileReader("filefullofmoney.txt"));
String strLine;
int numberOfLines = 0;
while ((strLine = in.readLine()) != null)
{
numberOfLines++;
}
Database[] accounts = new Database[numberOfLines];
String[] array1 = new String[3];
int i;
int j = 0;
while (j < numberOfLines)
{
for (i=0; i < 2; i++)
{
array1[i] = in.readLine();
}
accounts.add(new Database(array[0],array[1],array[2]));
}
}
}
class Database
{
public String accountName;
public int pin;
public double balance;
}
我遇到问题的部分是accounts.add(新数据库(数组[0],数组[1],数组[2]));
基本上我的文本文件将以这种方式格式化:
Account1 name
Account1 pin
Account1 balance
Account2 name
Account2 pin
Account2 balance
etc...
我希望能够将每个帐户的3行文本添加到arraylist中的一个元素中。
我不确定我的实际工作量有多少,因为我无法编译它。
非常感谢任何帮助。感谢
答案 0 :(得分:2)
您的代码存在一些问题:
Database
类(应该命名为Account
)没有指定的构造函数。 string
转换为实际数据类型(int
和double
)。 catch(Exception)
中。您的代码的可能解决方案可能是这个(我还没有测试它是否真的有效):
private static String getLineContent(String value) {
return value.substring(value.indexOf(' ') + 1);
}
public static void main(String[] args) {
BufferedReader in;
try {
in = new BufferedReader(new FileReader("filefullofmoney.txt"));
} catch (FileNotFoundException ex) {
// TODO: Handle the error with a nice error message.
return;
}
List<Account> accounts = new ArrayList<Account>();
while (true) {
try {
String accountName = in.readLine();
if (accountName == null) {
// We have no new accounts. So we exit.
break;
}
accountName = getLineContent(accountName);
int pin = Integer.parseInt(getLineContent(in.readLine()));
double balance = Double.parseDouble(getLineContent(in.readLine()));
accounts.add(new Account(accountName, pin, balance));
} catch (IOException ex) {
// TODO: Handle the error with a nice message saying that the file is malformed.
}
}
}
class Account {
public String accountName;
public int pin;
public double balance;
public Account(String accountName, int pin, double balance) {
this.accountName = accountName;
this.pin = pin;
this.balance = balance;
}
}
答案 1 :(得分:1)
您正在使用array1
和array
选择一个,它将进行编译。
此外,你应该结合这两个while循环。 提示:您无需了解numberOfLines
。
答案 2 :(得分:0)
将班级重命名为Account
而不是Database
。
然后:readLine()方法将返回整行,所以:
Account1 Martijn Courteaux
将是一行。要从中获取名称,您可以使用String.substring()
:
String line = null; // Temp
String name = (line = in.readLine()).substring(line.indexOf(' '));
对另外两个值执行相同的操作:
int pin = Integer.parseInt((line = in.readLine()).substring(line.indexOf(' ')));
double balance = Double.parseDouble((line = in.readLine()).substring(line.indexOf(' ')));
然后使用这些值将它们传递给构造函数:
accounts.add(new Account(name, pin, balance));
答案 3 :(得分:0)
你应该改变
Database[] accounts = new Database[numberOfLines];
是
ArrayList<String[]> accounts = new ArrayList<String[]>();
然后在你有
的循环中accounts.add(new Database(array[0],array[1],array[2]));
替换为
accounts.add(array1);
此外,你永远不会增加J,所以你的程序只会得到第一条记录。
如果必须使用已创建的Database类,则需要添加一个接受这些参数的构造函数。
答案 4 :(得分:0)
下面:
BufferedReader in = new BufferedReader(new FileReader("filefullofmoney.txt"));
String line;
StringBuilder account = new StringBuilder();
List<Database> accounts = new ArrayList<Database>();
int count = 1;
while ((line = in.readLine()) != null) {
account.append(line);
account.append("---")
if (count % 3 == 0) {
Database data = new Database();
data.accountName = account.toString().split("---")[0];
data.pin = Integer.parseInt(account.toString().split("---")[1]);
data.balance = Double.parseDouble(account.toString().split("---")[2]);
accounts.add(data);
account = new StringBuilder();
}
count++;
}
in.close();
<强>解释强>
正在读取文件并且每3行(名称,引脚,余额),数据被添加到帐户列表中(%表示在分割时返回余数的模数)。由于引脚和平衡不是字符串,因此必须分别将字符串解析为整数和双精度。