在 java 中将 getter 和 setter 与 ArrayList 一起使用

Using getters and setters with ArrayLists in java

我正在尝试读取 csv 并将记录存储在 ArrayList 中。 因为我知道没有。 csv 文件中的记录数我在创建对象时指定了大小,即 600。 我希望程序能够读取未知编号的文件。的记录。 如何让它动态化。

这是包含 600 条记录的文件的工作代码。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.*;


public class BankRecords extends Client{
//Create objects for processing data
//private static int count;
static BankRecords[] obj=new BankRecords[600];
static List<List<String>> array = new ArrayList<List<String>>();
@Override
void readData() {
    // TODO Auto-generated method stub
    String line=" ";
    //int i=0;

    //try with resources statement
    try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){

        while((line=br.readLine()) != null) //read from file
        {   
            array.add(Arrays.asList(line.split(",")));
            //check data
            //count++;
            //System.out.println(array.get(i++));
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    processData();
}
@Override
void processData() {
    // TODO Auto-generated method stub

    int idx=0;
    for(List<String> bankData: array)
    {

        obj[idx]= new BankRecords();
        obj[idx].setId(bankData.get(0));
        obj[idx].setAge(Integer.parseInt(bankData.get(1)));
        obj[idx].setSex(bankData.get(2));
        obj[idx].setRegion(bankData.get(3));
        obj[idx].setIncome(Double.parseDouble(bankData.get(4)));
        obj[idx].setMarried(bankData.get(5));
        obj[idx].setChild(Integer.parseInt(bankData.get(6)));
        obj[idx].setCar(bankData.get(7));
        obj[idx].setSact(bankData.get(8));
        obj[idx].setCact(bankData.get(9));
        obj[idx].setMort(bankData.get(10));
        obj[idx].setPep(bankData.get(11));


        idx++;

        //System.out.println(obj[idx].getId());
        }

    printData();
}





@Override
void printData() {

    //Printing First 25 ID, age, sex, region, income and mortgage
    System.out.println("ID\t\tAGE\t\tSEX\t\tREGION\t\tINCOME\t\tMORTGAGE\n");
    for(int i=0;i<25;i++){

        String s=String.format("%s\t\t%s\t\t%s\t\t%-10s\t%8.2f\t%2s", obj[i].getId(),obj[i].getAge(),obj[i].getSex(),obj[i].getRegion(),obj[i].getIncome(),obj[i].getMort());
        System.out.println(s);
    }
}
public String getId() {
    return id;
}




public void setId(String id) {
    this.id = id;
}




public int getAge() {
    return age;
}




public void setAge(int age) {
    this.age = age;
}




public String getSex() {
    return sex;
}




public void setSex(String sex) {
    this.sex = sex;
}




public String getRegion() {
    return region;
}




public void setRegion(String region) {
    this.region = region;
}




public double getIncome() {
    return income;
}




public void setIncome(double income) {
    this.income = income;
}




public String isMarried() {
    return married;
}




public void setMarried(String married) {
    this.married = married;
}




public int getChild() {
    return child;
}




public void setChild(int child) {
    this.child = child;
}




public String getCar() {
    return car;
}




public void setCar(String car) {
    this.car = car;
}




public String getSact() {
    return sact;
}




public void setSact(String sact) {
    this.sact = sact;
}




public String getCact() {
    return cact;
}




public void setCact(String cact) {
    this.cact = cact;
}




public String getMort() {
    return mort;
}




public void setMort(String mort) {
    this.mort = mort;
}




public String getPep() {
    return pep;
}




public void setPep(String pep) {
    this.pep = pep;
}




public static void main(String[] args) {
    // TODO Auto-generated method stub
    BankRecords bnk= new BankRecords();
    bnk.readData();
}

}

您不必事先知道记录数即可使用 ArrayList。您可以在构造函数中指定一个默认大小,但是如果您添加的记录多于此,它会自动扩展。

ArrayList 可以动态添加元素,所以不需要提前知道大小。

但是,对于BankRecords数组,最初不要用600来初始化它。而是做这样的事情:

static BankRecords[] obj = null;
static List<List<String>> array = new ArrayList<List<String>>();
void processData() {
    // TODO Auto-generated method stub
    obj=new BankRecords[array.size()];
    // TODO do your work here 
}

您快完成了,但是出于一些奇怪的原因,您在已经有数组的地方使用了列表;但另一方面,您正在使用一个数组,其中 List 更适合。

您可以按如下方式修改代码:

// TODO Auto-generated method stub

提示:这些 TODO 是由您的 IDE 生成的。这个想法是,一旦你有了一些真实的内容,你就 删除 它们。保留它们意味着在您的源代码中留下垃圾。任何不会为您的源代码增加实际价值的东西:删除。总是。立即地!

String line=" ";
List<Bankrecord> records = new ArrayList<>();
//int i=0; ... again: unused code --- remove that!
try(BufferedReader br = new BufferedReader(new FileReader("bank-Detail.csv"))){
    while((line=br.readLine()) != null) //read from file
    {   
      String[] lineData = line.split(",");
      BankRecord recordForNewLine = buildRecordFrom(lineData);
      records.add(recordForNewLine);
    } ...

然后你可以将你的 processData 改造成类似的东西:

private BankRecord buildRecordFrom(String[] lineData) {
  BankRecord newRecord = new BankRecords();
  newRecord.setId(lineData[0];
  ...
  return newRecord;
}

以及您真正应该考虑改变的事情:

  • 通过简单地假设该列包含一个有效的 ID,而下一列包含一个有效的 xyz 来建立您的银行记录......是一个糟糕的想法。
  • 相反,你应该验证你所有的输入:你应该检查你从split获得的每个数组都**准确预期长度。然后必须验证该数组中的每个值是否具有预期的 "content"
  • 然后,从建模的角度来看:您的 Bankrecord class 上有大量 setters。但那是完全错误的!在现实生活中,当一些"record"被创建时,它的基本属性(比如它的ID)在创建之后就不能再改变了!
  • 相反,您应该确保 class 中的此类属性在创建对象后无法更改。前往方式:Builder pattern!

最后:我上面的代码是为了 "inspiration point" 让你继续。不要盲目copy/paste它;可能有各种拼写错误 - 只需阅读它,直到您了解它在做什么(以及为什么)(它正在做什么)!

那么:我希望你明白 真正的 CSV解析比围绕“,”拆分要复杂得多(例如:CSV数据中的字符串也可以包含',';然后你的简单拆分会撕掉那个字符串!) 如果您认真对待解析现实世界中其他人的 CSV 输入,那么您最好考虑使用现有的库来为您完成这项工作。编写正确 CSV 解析器是艰苦的工作(而且不是很有回报;因为这意味着无缘无故地重新发明一个复杂的轮子)!