【问题标题】:Find the change in value in time series找出时间序列中值的变化
【发布时间】:2016-06-03 08:47:18
【问题描述】:

我有一张地图,以下列格式存储一个人工资的时间序列数据

HashMap<Date,Double> salaryHistory;

变量salaryHistory 可以包含从 1AD 到甚至 2100AD 的数据。

我正在使用subMap 从哈希图中过滤数据,但我在以下场景中面临挑战

考虑这样的人的薪水

Jan-01-1969, 100
Jan-01-1979, 200

当用户查询 1970 年 1 月 1 日到 1972 年 1 月 1 日之间的工资时,subMap 返回“null”,但实际上应该返回 100,因为该人的工资在 1969 年是 100,并且从未改变直到 1979 年。

有没有简单的方法来做到这一点?像图书馆一样。

请提供您宝贵的建议

【问题讨论】:

  • 您的逻辑不能只测试给定日期是否在两个键之间并提供两个值中的较低值吗?

标签: java hashmap time-series treemap


【解决方案1】:

我发现如果你使用 SortedMap 而不是 HashMap,你会得到你期望的行为:

   Date j1969 = DateTimeUtils.convertStringToDate("1969-01-01");
   Date j1974 = DateTimeUtils.convertStringToDate("1974-01-01");
   Date j1979 = DateTimeUtils.convertStringToDate("1979-01-01");
   Date j1989 = DateTimeUtils.convertStringToDate("1989-01-01");

   TreeMap<Date, Double> treemap = new TreeMap<Date, Double>();
   SortedMap<Date, Double> treemapincl = new TreeMap<Date, Double>();

   // populating tree map
   treemap.put(j1969, 100.0);
   treemap.put(j1979, 200.0);
   treemap.put(j1989, 300.0);

   treemapincl=treemap.subMap(j1969,j1974);
   System.out.println("Sub map values: "+treemapincl);   

输出:

Sub map values: {Wed Jan 01 00:00:00 GMT-05:00 1969=100.0}

【讨论】:

    【解决方案2】:

    如果您不必使用HashMap,请考虑将其替换为TreeMap。然后您可以使用TreeMap.floorEntry() 获取相关的Entry

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多