我有一个链接哈希表(我的查询按时间对点进行排序)包含了数据库中的库存数据,时间以午夜后的(int)秒为单位,并且在MYSQL和Java中均为双精度值。我已附上以下数据样本。我们在特定日期获得的数据量各不相同,但通常接近1万个条目。
30607,131.46
30608,131.44
30608,131.45
30609,131.46
30611,131.48
30613,131.49
30615,131.51
30615,131.5
我们正在对数据进行图表处理,但我没有足够的声誉来向您展示图片,但是它基本上看起来像是Yahoo财务图表。 yahoo做的一件很酷的事情是,它会检测到鼠标的位置,然后在特定时间告诉您图形的值(美元数量),我试图模仿这种效果。 (由于其他原因,我们不能使用我们发现的任何免费图形实用程序,而商业级的实用程序则超出了我们的价格范围。
因此,我有一个LinkedHashMap,并且有一个函数可以将像素的xvalue转换为大约时间(如果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秒一次),因此从理论上讲,使用第二个选项在找到可以使用的东西之前不必扫描很远。值图很好,但是我想使用其他两个函数之一实时绘制或获取这些值时为每个点创建一个值图吗?
我一直在通过Google搜索使用stackoverflow,但是我找不到这个问题的好答案,所以我实际上是在问一个。提前致谢!如果有更好的方法可以做到,我全神贯注。
最佳答案
您不需要此工作(链接)HashMap
。
使用NavigableMap(TreeMap
是标准实现),它为此类用例提供了许多有用的操作:下限/上限,上限/下限,第一/最后一个,等等。
// get the value at this specific time or the last one before that
Double valueAtTheTime = map.floorEntry(theTime).getValue();