在java中使用带有ArrayLists的getter和setter

时间:2016-09-25 07:33:39

标签: java csv arraylist getter-setter

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

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

ORA-12560: TNS:Protocol adapter error.

}

3 个答案:

答案 0 :(得分:0)

您无需事先知道记录数量即可使用ArrayList。您可以在构造函数中指定默认大小,但是如果添加的记录多于此值,则它足够智能扩展自己。

答案 1 :(得分:0)

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 
}

答案 2 :(得分:0)

你几乎就在那里,但由于一些奇怪的原因,你在已有阵列的地方使用列表;但另一方面,你正在使用一个数组,其中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 获得的每个数组是否具有**预期长度。然后必须验证该数组中的每个值是否具有预期的“内容”
  • 然后,从建模的角度来看:你的Bankrecord课上有很多 setters 。但这完全错了!在现实生活中,当创建一些“记录”时,它的基本属性(例如其ID)在创建后无法更改!
  • 相反,您应确保在创建对象后无法更改类中的此类属性。去的地方:Builder pattern

最后:我上面的代码意味着让你前进的“灵感点”。不要盲目地复制/粘贴它;可能会出现各种错别字 - 只要阅读它就会得到它正在做什么(以及为什么)(它正在做什么)!

然后:我希望您理解真实 CSV解析比拆分“,”更复杂(例如:CSV数据中的字符串也可以包含',';然后您的简单拆分撕掉那串!) 如果您认真解析现实世界中其他人的CSV输入,那么最好使用现有的库来为您完成此操作。编写正确 CSV解析器很难工作(并且不是很有价值;因为这意味着无缘无故重新发明一个复杂的轮子)!