嵌套的HashMap结构

时间:2014-06-25 06:06:02

标签: java data-structures hashmap options

我是java的新手。我希望建立一个快速查找的数据结构。我的专栏是:

  • 日期
  • 到期日(每个日期有多个到期日)
  • 选择选项(看涨/看跌)
  • 行使价(每个日期有多个行使价)
  • 结算价格

所以基本上我的用户会选择日期,期权(看涨/看跌期权),执行价格,到期日。
我需要退回收盘价。我决定制作嵌套的HashMaps。第一个是带键的选项类型 - 调用和放置,值为另一个HashMap ExpiryDate,它指向Strike,它再次指向最终指向收盘价的日期。

我在填充数据时遇到问题,因为我的结算价格被覆盖在最后一个hashMap中,因为具有不同执行价格的单个日期有多个结算价格。

LinkedHashMap<String,LinkedHashMap<String, LinkedHashMap<Double, LinkedHashMap<String, Double>>>> Option= new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<Double,LinkedHashMap<String,Double>>>>();
LinkedHashMap<String, LinkedHashMap<Double, LinkedHashMap<String, Double>>> Expiry= new LinkedHashMap<String, LinkedHashMap<Double,LinkedHashMap<String,Double>>>();
LinkedHashMap<Double, LinkedHashMap<String, Double>> Strike= new LinkedHashMap<Double, LinkedHashMap<String, Double>>();
LinkedHashMap<String, Double> Date= new LinkedHashMap<String, Double>();

 for(i=0;i<70000;i++){
            Option.put(Option1[i], Expiry);
            Expiry.put(ExpiryDate1[i], Strike);
            Strike.put(Strike1[i], Date);
            Date.put(CurrentDate1[i], CPrice[i]);

        }

Option1,ExpiryDate1,Strike1,CurrentDate1都是从我的Excel工作表中获取数据的数组。但显然我无法在数组中查找,因为它太耗费时间。所以,我决定去HashMaps。我的for循环是填充数据。我假设HashMaps只存储唯一的数据。因此,这必须存储每种可能的组合。但我的收盘价正在被覆盖!原谅如果有些愚蠢的错误。我刚刚开始编写用于构建股市策略的程序!谢谢!

2 个答案:

答案 0 :(得分:0)

检查您是否创建了一个新的哈希映射实例。一些陷阱是使用相同的hashmap实例来填充不同的条目。

例如,这是错误代码的示例

如果您有任何不一致的地方,请检查您的代码,例如下面提到的代码段。

Map<Date,Map<String,Date>> testMap = new HashMap<Date,Map<String,Date>>
Map<String,Date> testMap2 = new HashMap<String,Date>();
for(int i = 1; i < 10 ; i++) {
    for(int j = 1; j < 10 ; j++) {
       testMap2.put(String.valueOf(j), new Date());
    }
    testMap.put(new Date(), testMap2);
}

答案 1 :(得分:0)

您需要做的是将所有数据放在一个容器中,并使用不同的索引对其进行索引。为此,您可以使用属性选项,expiryDate,strike,date和cPrice创建class Stock。代码很简单,但问你是否有任何问题。也是Stock的构造函数,它接受所有数据作为参数并设置字段。

之后你可以这样做:

for(i=0;i<70000;i++){
    stock = new Stock(Option1[i], ExpiryDate1[i], Strike1[i], CurrentDate1[i], CPrice[i])
    optionMap.put(stock.getOption(), stock);
    expiryMap.put(stock.getExpiryDate(), stock);
    strikeMap.put(stock.getStrike(), stock);
    dateMap.put(stock.getDate(), stock);
    cPriceMap.put(stock.getCPrice(), stock);
}

每个股票的代码创建一个类Stock的实例,并将REFERENCES(不是对象的克隆,没有额外的内存)添加到不同的HashMaps。 for中的每个映射都是HashMap的一个实例,具有正确的泛型。同样,简单的代码,询问是否有任何不清楚。

有了这个,你基本上有5个索引,每个索引由一对(密钥,引用)组成,只复制(quintiplicating?)对Stock实例的引用,而不是对象本身。这意味着您没有使用五倍的内存,并且您可以在任何地图中搜索库存(根据您要搜索的键),从对象更改任何内容(保存删除它)和更改将反映在所有地图上。

至于你的解决方案存在的问题:&#34;假设我每天有3000到4000的10个执行价格。每天每个执行价格的收盘价将会有所不同。&#34;您可以使用警示作为关键字搜索strikeMap。我相信它可以解决您的问题,但如果它没有

,请告诉我

-----以下是原文(不正确)答案,只是如此离开-----

您可能会在多个地图中插入对同一对象的引用。如果是这种情况,则在一个引用中进行的更改将更改另一个映射上另一个(不相关的)引用所指向的对象ClosingPrice。当然,如果您尝试获取对第二个地图的引用,该对象将会发生变化,因为它基本上是同一个对象(尽管由不同的引用指向),您将其插入到您想要独立变化的两个地图中

如果您发现问题与我上面的猜测一样,解决方案很简单:确保您在地图中插入并希望独立变化的每个引用实际上都是不同的对象。

如果您可以发布一些代码,那么帮助您会更容易。