gpt4 book ai didi

java - 带有时间值的 HashMap ,想要找到特定秒的值

转载 作者:行者123 更新时间:2023-11-30 03:24:54 24 4
gpt4 key购买 nike

我有一个链接 HashMap (我的查询按时间对点进行排序),其中包含来自数据库的股票数据,时间为午夜后的 (int) 秒,并且值在 MYSQL 和 Java 中都是 double 值。我附上了下面的数据样本。我们在特定日期获得的数据量各不相同,但通常接近 10k 条目。

30607,   131.46
30608,   131.44
30608,   131.45
30609,   131.46
30611,   131.48
30613,   131.49
30615,   131.51
30615、  131.5

我们正在绘制数据图表,我没有足够的声誉向您展示图片,但它基本上看起来很像雅虎财经图表。雅虎所做的一件很酷的事情是,它检测鼠标位置,然后告诉您图表在特定时间的值(value)(美元金额),我正在尝试模仿这种效果。 (由于其他原因,我们无法使用我们找到的任何免费绘图实用程序,并且商业级的绘图实用程序有点超出了我们的价格范围。

所以我有一个 LinkedHashMap,并且有一个函数可以将像素的 x 值转换为近似时间(如果 1 像素值超过一秒则为近似值)

public static final int getTimeFromPixel(Settings window, final int pixel) {
return (int) Math.round((window.getTimeStart() + window.getXPixelValue()
* (pixel - YAXIS)));
}

这是我正在考虑的三个选项(其中两个是如下所示的函数 - 所有伪代码且未编译,但我试图让它们接近正确)

/**
* Start at the beginning of my linkedhashmap "points" and then stop when the
* key is as close as possible. Break the for loop when the keys are past
* the time we are looking for since this is a linked hashmap and I know
* that the times were placed into the linkedhashmap in order.
* @param pixel_x the xvalue of a pixel (from a mouse event)
* @return the value at our stock at the closest before time we have data for
*/
public double iterateThroughLinkedHashMapToFindValue(int pixel_x) {
int pixelTime = Settings.getTimeFromPixel(window, pixel_x);
int closestTimeWeHave = 0;
for (int second : points.keySet()) {
if (Math.abs(pixelTime - second)
< Math.abs(pixelTime - closestTimeWeHave)) {
closestTimeWeHave = second;
}
if (second > pixelTime) {
break;
}
}
return points.get(closestTimeWeHave);
}

/**
* Start as close as possible to a key we want then start checking
* backwards until we find a value we have. Since we get values almost
* every 3 seconds, it shouldn't have to check very far to get a value.
* @param pixel_x the xvalue of a pixel (from a mouse event)
* @return the value at our stock at the closest before time we have data for
*/
public double tryToGetCloseToValueInHashMap(int pixel_x) {
// Go to the next pixel, subtract 1 second from that pixel (should put
// us at the far end of our current pixel if a pixel represents more
// than one second on our graph
int pixelTime = Settings.getTimeFromPixel(window, pixel_x + 1) - 1;
// count backwards until we find a time we have a value for.
while (!points.containsKey(pixelTime)) {
pixelTime--;
}
return points.get(pixelTime);
}

我的第三个选择是创建一个 double[] 数组,同时迭代这些点以将它们绘制在屏幕上,并为屏幕上的每个像素基本上制作一个值图,这样我就可以调用这样的函数

 public double getValueFromPixel(int pixel_x) {
return valueMap[pixel_x];
}

我的问题是哪一个(如果有的话)最好。正如您所看到的,我相当频繁地获取数据(平均每 3.5 秒一次),因此理论上使用第二个选项无需扫描很远就能找到可以使用的内容。值图很好,但我是否想在每次重绘或使用其他两个函数之一动态获取这些值时为每个点创建该值?

我一直通过谷歌搜索使用stackoverflow,但我找不到这个问题的好答案,所以我实际上是在问一个。提前致谢!如果有更好的方法来做到这一点,我洗耳恭听。

最佳答案

您不需要(链接的)HashMap 来完成这项工作。使用NavigableMap (TreeMap 将是标准实现),它为此类用例提供了许多有用的操作:地板/天花板、较高/较低、第一个/最后一个等等。

// get the value at this specific time or the last one before that
Double valueAtTheTime = map.floorEntry(theTime).getValue();

关于java - 带有时间值的 HashMap ,想要找到特定秒的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com