如何在TreeMap中使用部分键搜索值

时间:2019-06-21 12:50:05

标签: java search treemap

我需要使用部分键在TreeMap中搜索一个值

我尝试了HashMap,但是失败了

TreeMap<String, BigDecimal> mapYr1 = new TreeMap<String, BigDecimal>();

mapYr1.put("abcdef",100.00);

是否可以使用类似下面的内容来检索100.00的值?

mapYr1.get("abcd");

在这里,我只知道“ abcd”。我不确定键的“ ef”部分。

1 个答案:

答案 0 :(得分:1)

不是直接的,但是您可以浏览条目并进行搜索:

public static BigDecimal findPartialKey(Map<String, BigDecimal> map, String search) {
    return map.entrySet()
              .stream()
              .filter(e -> e.getKey().startsWith(search))
              .map(Map.Entry::getValue)
              .findFirst()
              .orElse(null);
}

请注意,使用这样的流虽然(可能)很优雅,但没有利用TreeMap中的键已排序的事实,并且可能浪费时间在区域中寻找匹配的键不能包含它。使用一个好的老式循环可能会比较笨拙,但是在一般情况下,应该会表现得更好:

public static BigDecimalfindPartialKey(SortedMap<String, BigDecimal> map, String search) {
    Iterator<Map.Entry<String, Double>> iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry<String, Double> entry = iter.next();
        String key = entry.getKey();
        if (key.startsWith(search)) {
            return entry.getValue();
        }
        if (key.compareTo(search) > 0) {
            return null;
        }
    }
    return null;
}