找到下一个最小的密钥(需要性能建议)

时间:2014-02-07 16:50:50

标签: java algorithm list search map

我在性能方面需要一些建议。我有一个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)即可获得匹配值。

但是我能做些什么吗?

2 个答案:

答案 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
}

注意:您可能需要ceilingEntryhigherEntry,具体取决于您是否需要(分别为)>=>

答案 1 :(得分:3)

看看NavigableMap。这似乎正是你所需要的。

当您搜索最接近且严格小于输入的DateTime时,我会选择floorEntry(key)进行查找。但请确保您正确处理空值。地图中可能没有一个严格小于输入的键!如果您尝试向BigDecimal添加空引用,则将抛出NullPointerException。

相关问题