【问题标题】:double inexing an array without int对没有 int 的数组进行双索引
【发布时间】:2016-07-25 18:56:19
【问题描述】:

我正在将特定日期的许多股票的历史数据从 CSV 文件导入 Java。我的目标是使用我构建的 Java 程序在某些日期交易(买卖)其中一些代码。该程序仅配置为使用一个代码,但现在我想将其扩展为使用数千个(超过数千个日期)。

我有两张表格,一张包含股票代码和何时买入/卖出,另一张(如下图所示)包含所有价格和历史信息。 使用这两个,如果在表 1 中我有一个指示,在 y 日期通过股票代码 x,我希望能够在价格下跌时卖出股票代码 x,比如说,购买价格的 80%。为了促进这种决策,对于我可能交易的每个股票代码,我都有大约十年的历史数据。我的表二有几千万行。

我希望能够使用代码和日期标识符来引用我的每一列(市值、市盈率、beta...)。我想以这样一种方式处理我的数据,以便(在 Java 中)找到特定代码在特定日期范围内的 p/e 的最小值和最大值。

我认为我应该为每个代码和日期组合创建一个“数字键”。它是代码中的每个字符,转换为 ASCII,连接并添加到日期。我以为我可以将这些中的每一个都用作索引数组的唯一标识符,但后来意识到我没有很好的方法来确定代码的数据何时开始以及何时结束。

哪种数据类型更适合这个?

【问题讨论】:

  • 你可能想要Map
  • @BasilBourque 我有数千万行,但只有 2500 个代码

标签: java arrays database types custom-data-type


【解决方案1】:

使用HashMap 和结合了ticker 和date 的键不是更好吗?

类似:

public class TickerDate {

    private final String ticker;
    private final Date date;

    public TickerDate(String ticker, Date date) {
        this.ticker = ticker;
        this.date = date;
    }

    // .. getters

    // equals + hashcode
}

在代码中肯定更容易理解。

其他选项是使用来自 Guava 的 Table,您不需要编写上面的 TickerDate 类。

【讨论】:

  • 这听起来与我在 Access 中使用的实现非常相似。谢谢! (我正确实现后给你打勾。)
  • 是的,差不多,但是你不需要这么大的表,数据会在桶里。
【解决方案2】:

数据库

对于大量数据,请使用数据库。像H2 Database Engine 这样的优秀数据库可以完全按照您的要求进行(搜索、排序、聚合计算),并且以优化的方式进行。

H2 特别是用纯 Java 编写的。它可以嵌入到您的 Java 应用程序中,也可以单独用作服务器。

如果您的部署机器上有很多内存,并且只需要临时数据,您可以通过让 H2 将表保存在内存中而不是持久化到磁盘来最大限度地提高性能。

H2 可以直接从 CSV 文件导入。见this tutorial

Apache Commons CSV

Apache Commons CSV 是一个方便的库,用于导入/导出 CSV 和制表符分隔文件。

我很喜欢成功使用它几次。简化阅读和解析的繁琐工作。

【讨论】:

  • 这是否意味着我可以轻松地从 Microsoft Access 导入关系数据库?
猜你喜欢
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2011-05-27
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多