【发布时间】:2014-06-09 20:54:54
【问题描述】:
当我逐个元素地遍历地图时,我需要找到最小值和最大值,如图所示(“索引”是地图的键数组的位置):
/**even: lowest, odd: highest*/
private Double[] getLowestAndHighestValues(final int index, final int timeRange, ConcurrentSkipListMap<String, Double> ... maps){
if(maps != null && maps.length > 0){
ArrayList<Object[]> keyArrayList = new ArrayList<>();
for(int i = 0; i < maps.length; i++){
try{
ConcurrentSkipListMap<String, Double> map = maps[i];
keyArrayList.add(map.keySet().toArray());
}
catch(Exception e){
}
}
Double[] values = new Double[maps.length * 2];
for(int i = index - timeRange; i < index; i++){
if(i >= 0){
for(int x = 0; x < maps.length; x++){
try{
if(x >= 0){
ConcurrentSkipListMap<String, Double> map = maps[x];
if(map != null){
final Object[] keyArray = keyArrayList.get(x);
final String key = (String) keyArray[i];
Double value = map.get(key);
if(value != null && !Double.isNaN(value)){
if(values[x * 2] == null){
values[x * 2] = value;
}
else{
if(values[x * 2] > value){
values[x * 2] = value;
}
}
if(values[(x * 2) + 1] == null){
values[(x * 2) + 1] = value;
}
else{
if(values[(x * 2) + 1] < value){
values[(x * 2) + 1] = value;
}
}
}
}
}
}
catch(Exception e){}
}
}
}
return values;
}
return null;
}
上面显示的糟糕代码需要非常长的时间并且是一个真正的瓶颈,尤其是当我每次索引增加时都必须获取地图子集的最小值和最大值时。有谁知道我怎样才能更快地实现相同的目标(获取每个地图子集的最高和最低值)?
谢谢。
【问题讨论】:
-
我的眼睛在流血。也许您应该重新考虑您的逻辑,以便在每次更改地图时使用第二个结构来保持最小值/最大值。
-
最小值和最大值是什么?最小值和最大值(双精度)?
-
请清楚地说明您的签名要求。对于索引在位置
index - timeRange到index的值,您是否需要返回每个Map的最小值和最大值?由于这种类型的 Map 的键按自然顺序排序,index作为int真的适用吗?您是缩进自然顺序位置还是插入顺序位置?通常在 Maps 中使用索引值是一种反模式。 -
我正在尝试获取地图数组子集的最小值和最大值。地图没有改变,但只要地图元素指针“index”指向的位置增加,就会重复调用该方法。另外,我相信我已经包含了代码,它应该可以告诉您我正在尝试做什么。
标签: java performance optimization