Как искать значение с частичным ключом в TreeMap - PullRequest
1 голос
/ 21 июня 2019

Мне нужно найти значение в TreeMap с частичным ключом

Я пытался с HashMap, но это не удалось

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

mapYr1.put("abcdef",100.00);

Возможно ли получить значение 100,00 с помощью чего-то подобного ниже?

mapYr1.get("abcd");

Здесь я знаю только «abcd». Я не уверен, что "ef" часть ключа.

1 Ответ

1 голос
/ 21 июня 2019

Не напрямую, но вы можете просмотреть записи и найти их:

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;
}
...