我有一个CSV文件,我在Java中存储为arraylist。这是我运行的代码
public class StockData {
private ArrayList<StockRecord> records;
public StockData() {
records = new ArrayList<StockRecord>();
}
//reads the file from the folder
public void loadPriceData(String filepath) {
try {
Scanner scanner = new Scanner(new FileReader(filepath));
String line;
StockRecord record;
scanner.nextLine();
while (scanner.hasNextLine()) {
line = scanner.nextLine();
String[] results= line.split(",");
double open = Double.parseDouble( results[1]);
double high = Double.parseDouble( results[2]);
double low = Double.parseDouble( results[3]);
double close = Double.parseDouble( results[4]);
double volume = Double.parseDouble( results[5]);
double adjClose = Double.parseDouble( results[6]);
//create the record
record = new StockRecord(results[0], open, high, low, close, volume, adjClose);
records.add(record);
}
scanner.close();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
代码正常工作,但是我在项目的下一部分遇到了麻烦。 数据示例
我试图打印日期范围的AdjClose价格。比如介于2016年6月13日至2016年6月15日期间。似乎我需要先找到日期的索引,然后打印价格记录。
我该怎么做?我不知道从哪里开始。我是否首先需要将日期保存在自己的列表/数组中并使用它来查找索引?
由于
答案 0 :(得分:0)
您需要遍历StockRecord列表并将每个记录的日期与指定范围进行比较。如果它落在你打印的范围内。如果列表已排序,则可以优化此选项。
答案 1 :(得分:0)
要比较第一个日期,最好使用数据类型date
如果您的数组可以搜索StockRecord类型的记录和对象,并比较您要评估的日期字段
for (StockRecord reg : records) {
if(reg.date.after(historyDate) && reg.date.before(futureDate)) {
System.out.println(reg.toString()); // print object
}
}
答案 2 :(得分:0)
您的问题实际上与Stack Overflow中的许多其他问题重复。
LocalDate
您的示例代码实际上并未将日期显示为StockRecord
类的一部分。但它应该是LocalDate
类型的成员。搜索有关如何将输入字符串解析为LocalDate
的无数帖子的Stack Overflow。
Comparator
为您的班级定义Comparator
,以提取LocalDate
进行比较。 LocalDate
类本身实现了compareTo
方法,以及isBefore
,isAfter
和isEqual
。
如果您经常进行此查询,则将StockRecord
个对象排序为List
是有意义的。然后你可以聪明地搜索,再次在Stack Overflow中的许多其他帖子中进行讨论。
SortedMap
您可以将StockRecord
个对象整理为SortedMap
,将LocalDate
映射到共享该特定日期的StockRecord
个Collection
个对象。如上所述,使用SortedMap
而不仅仅Map
可以让您更智能地搜索日期范围。 Stack Overflow上有很多关于地图的帖子。
顺便说一句,Apache Commons CSV项目可以轻松阅读和解析CSV数据文件。
BigDecimal
不使用double
或Double
作为货币金额,或使用准确性重要的任何小数。这些类型是floating-point类型,是为了提高速度而牺牲精确度。您将在小数部分的末尾引入无关的额外数字。
而是使用BigDecimal
。再一次,Stack Overflow上有很多关于这个课程的帖子。
请勿使用Double
之类的小数作为整数,例如Volume
字段。这样做会浪费内存,并且会给读取代码的人造成混淆。
如果您的最大值为20亿或更少(2 ^ 31-1 = 2,147,483,647),则使用32位integer
或Integer
,否则为64位long
或{ {3}}