【问题标题】:Best way to convert ticks to minuts in Java (finance)在 Java 中将刻度转换为分钟的最佳方法(金融)
【发布时间】:2016-05-16 15:30:17
【问题描述】:

我有一个庞大的数据库,其中每天包含一个具有以下格式的文本文件: “HH:mm:ss xxxx.xx” 几乎每个交易日的每一秒,所以我在每个文本的文件中有数千行。 我正在寻找将这些行转换为 HashMap 的最佳方法,其中每个键代表交易日的新一分钟。

例如,我想写几行:

00:08:48    9819,9
00:09:10    9818,7
00:09:44    9819,9
00:09:51    9820,9
00:10:07    9822,1

在 HashMap 中看起来像这样:

myHashMap.put("00:09:00", 9818.7)

myHashMap.put("00:10:00", 9822.1)

PS:我知道“00:09:00”不是一个好的日期格式,它只是为了示例!

【问题讨论】:

  • 听起来更像是 SQL 数据库的工作,之后您可以使用 with grouping 创建一个 SELECT QUERY。无论如何,当您使用 Java 时,请注意 HashMap 不会存储具有相同键的多个条目。
  • 如果您认为您可以做的不仅仅是对每分钟的第一个刻度进行快照,您可以考虑获取一个使用 Esper 的简单示例。这是他们关于 CSV 源的文档espertech.com/esper/release-5.3.0/esperio-reference/html/… 然后您可以在类似流式 SQL 的语法中执行更高级的运算符。 select first(*), last(*) from SensorEvent.win:time(10 sec) 但如果你没有机会想要更多东西,它可能有点矫枉过正。

标签: java date finance


【解决方案1】:

如果您正在使用 - Files#lines 在这方面做得很好。 LocalTime 类代表一天中的时间。

警告:如果要在内存中创建太多对象,则可能会抛出 OutOfMemoryError

Map<LocalTime, Double> map = Files.lines(Paths.get("D:\\data.txt"))
                                  .map(x -> x.split(" "))
                                  .collect(Collectors.toMap(
                                               x -> LocalTime.parse(x[0]), 
                                               x -> Double.valueOf(x[1])));

对于特定的double 格式,您可以使用以下

(Double)NumberFormat.getInstance(Locale.GERMANY).parse(x[1]))

货币

由于数据似乎是货币数据,BigDecimal 可能是比Double 更好的选择。

Map<LocalTime, BigDecimal> map = Files.lines(Paths.get("D:\\data.txt"))
                                  .map(x -> x.split(" "))
                                  .collect(Collectors.toMap(
                                               x -> LocalTime.parse(x[0]), 
                                               x -> new BigDecimal(x[1])));

【讨论】:

  • 这可以通过先拆分字符串然后制作地图来提高效率。 IE。 .map(line -&gt; line.split(" ")).lines(...) 之后。
  • 另外,鉴于数据使用逗号作为小数位, (Double)NumberFormat.getInstance(Locale.GERMANY).parse(x[1])) 可能更适合地图。
  • 很好的答案,但我会用 BigDecimal 替换 Double 以确保准确性,因为这些值显然是货币。
  • 非常感谢,这真的很有帮助!
猜你喜欢
  • 2010-09-28
  • 2023-03-18
  • 2013-06-23
  • 1970-01-01
  • 2020-02-18
  • 2020-09-05
  • 2023-03-05
  • 2011-10-01
  • 2011-01-21
相关资源
最近更新 更多