在ArrayList中查找索引

时间:2016-08-28 22:05:24

标签: java csv arraylist indexing

我有一个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());
        }
}

}

代码正常工作,但是我在项目的下一部分遇到了麻烦。 数据示例

  1. 日期打开高低关闭量调整关闭
  2. 6/10/2011 128.85 128.93 127.26 127.6 238629400 126.97
  3. 6/13/2011 127.89 128.24 127.05 127.7 207599800 127.07
  4. 6/14/2011 128.87 129.77 128.82 129.32 160570400 128.68
  5. 6/15/2011 128.24 129.3 126.68 127.02 300958000 126.39
  6. 6/16/2011 127.06 127.97 126.32 127.3 308032800 126.67
  7. 我试图打印日期范围的AdjClose价格。比如介于2016年6月13日至2016年6月15日期间。似乎我需要先找到日期的索引,然后打印价格记录。

    我该怎么做?我不知道从哪里开始。我是否首先需要将日期保存在自己的列表/数组中并使用它来查找索引?

    由于

3 个答案:

答案 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方法,以及isBeforeisAfterisEqual

排序的好处

如果您经常进行此查询,则将StockRecord个对象排序为List是有意义的。然后你可以聪明地搜索,再次在Stack Overflow中的许多其他帖子中进行讨论。

SortedMap

您可以将StockRecord个对象整理为SortedMap,将LocalDate映射到共享该特定日期的StockRecordCollection个对象。如上所述,使用SortedMap而不仅仅Map可以让您更智能地搜索日期范围。 Stack Overflow上有很多关于地图的帖子。

Apache Commons CSV

顺便说一句,Apache Commons CSV项目可以轻松阅读和解析CSV数据文件。

BigDecimal

不使用doubleDouble作为货币金额,或使用准确性重要的任何小数。这些类型是floating-point类型,是为了提高速度而牺牲精确度。您将在小数部分的末尾引入无关的额外数字。

而是使用BigDecimal。再一次,Stack Overflow上有很多关于这个课程的帖子。

整数

请勿使用Double之类的小数作为整数,例如Volume字段。这样做会浪费内存,并且会给读取代码的人造成混淆。

如果您的最大值为20亿或更少(2 ^ 31-1 = 2,147,483,647),则使用32位integerInteger,否则为64位long或{ {3}}