Лучший способ сравнить связку константных строк (ключей) с картой - PullRequest
0 голосов
/ 18 февраля 2019

Итак, у меня есть карта (строка, строка), которую я получаю, эта карта может содержать около 600-800 записей.Моя задача - получить только около 60-120 (на основе некоторой логики) этих пар на основе ключей (константных строк).

Сейчас я создал список требуемых ключей, я выполняю итерациюКарта, которую я получаю, и вытаскиваю нужные пары в другую карту и передаю ее дальше.Это работает, но код выглядит ужасно.

Конечно, должен быть лучший способ сделать это.Любые предложения?

Я думал об использовании вместо соответствующих ключей содержит, но мое требование для точных совпадений.Да, я читал об использовании RegEx для точных совпадений, чтобы его можно было использовать в качестве крайней меры.

Что мне нужно для помощи: 1. Лучший способ хранить требуемые ключи, чем иметь их в списке.Этот список ключей будет постоянным.Наличие списка из 60-120 строк, жестко закодированных в список, выглядит ужасно.2. Самый быстрый (по времени) способ сравнить указанный список и вывести необходимые пары.

Мой код:

List <String> keysToCheck = new ArrayList<String>();
keysToCheck.add("attrib1");
...
keysToCheck.add("attribN");

Map<String, String> newMap = new HashMap<String,  String>();
for (String key : keysToCheck) {
    if(mapRcvd.containsKey(key)) {
    newMap.put(key, mapRcvd.get(key));
    }
}

Я ищу решения, которые были бы быстрее, так как это было быочень маленькая часть большого приложения.Мне хорошо, что для этого нужно написать много кода.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете хранить все постоянные ключи в файле, где каждая строка содержит один ключ.Затем вы можете получить все необходимые ключи, такие как:

List<String> requiredKeys = Files.lines(Paths.get(PATH_TO_FILE_WITH_KEYS))
            .collect(Collectors.toList());

Теперь получите карту с необходимыми ключами, используя метод stream filter:

 Map<String, String> collect = mapRcvd.entrySet().stream()  // get stream of map entries
            .filter(entry -> requiredKeys.contains(entry.getKey()))  // filter only such entries which has required key
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));  // collect all filtered entries into new map

Подробнее о Collectors.toMap, javadoc

Обновление: при получении карты с необходимыми ключами может показаться более компактным, цикл for с методом containsKey вваш пример быстрее чем contains.Вам, вероятно, стоит воспользоваться советом @Holger, оставленным в комментариях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...