在 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 解析器是艰苦的工作(而且不是很有回报;因为这意味着无缘无故地重新发明一个复杂的轮子)!
我正在尝试读取 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 解析器是艰苦的工作(而且不是很有回报;因为这意味着无缘无故地重新发明一个复杂的轮子)!