我在性能方面需要一些建议。我有一个Map<DateTime, String>
。我需要类似以下方法:
Map<DateTime, BigDecimal> map; // about 50 entries. Btw: Which impl to choose?
BigDecimal findNextSmaller(DateTime input) {
DateTime tmp = null;
for(DateTime d : map.keySet()) {
if(tmp == null && d < input) {
tmp = d;
}
if(d < input && d > tmp) {
tmp = d;
}
}
return map.get(tmp);
}
所以基本上我只是遍历我的Map
的keySet并尝试找到与input
相比最小的键。
此方法将连续调用约1.000.000次:
BigDecimal sum;
List<Item> items; // about 1.000.000 Items
for(Item i : items) {
sum = sum.add(findNextSmaller(i.getDateTime()));
}
现在我正在寻找一种让事情变得更快的方法。
我的第一个想法是从OrderedList
的keySet中创建一个Map
。所以平均而言,我只需要迭代DateTime
的一半以上。然后只需执行map.get(dateTimeFromOrderedList)
即可获得匹配值。
但是我能做些什么吗?
答案 0 :(得分:4)
您可以使用具有built-in method的TreeMap:
TreeMap<DateTime, BigDecimal> map = new TreeMap<>();
//populate the map
BigDecimal findNextSmaller(DateTime input) {
return map.ceilingEntry(input).getValue(); //add exception checking as required
}
注意:您可能需要ceilingEntry
或higherEntry
,具体取决于您是否需要(分别为)>=
或>
。
答案 1 :(得分:3)
看看NavigableMap。这似乎正是你所需要的。
当您搜索最接近且严格小于输入的DateTime时,我会选择floorEntry(key)进行查找。但请确保您正确处理空值。地图中可能没有一个严格小于输入的键!如果您尝试向BigDecimal添加空引用,则将抛出NullPointerException。