需要帮助从文本文件中读取行并将它们添加到ArrayList

时间:2011-11-22 20:01:01

标签: java

对于我的家庭作业,我应该创建一个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中的一个元素中。

我不确定我的实际工作量有多少,因为我无法编译它。

非常感谢任何帮助。感谢

5 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

  • 您的Database类(应该命名为Account)没有指定的构造函数。
  • 您没有对这些行进行子串,因此您可以获得所有“Database#”前缀。
    • 我可以问你为什么甚至有前缀?它们似乎是多余的。
  • 您不会将string转换为实际数据类型(intdouble)。
  • 当您只需要执行一次时,您将内容循环两次。
  • 您没有适当的异常处理;你永远不应该把所有东西都包在一个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)

您正在使用array1array选择一个,它将进行编译。

此外,你应该结合这两个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行(名称,引脚,余额),数据被添加到帐户列表中(%表示在分割时返回余数的模数)。由于引脚和平衡不是字符串,因此必须分别将字符串解析为整数和双精度。