Ускорьте запись в hashmap - PullRequest
1 голос
/ 24 июня 2019

У меня есть Hashmap, состоящий из фиксированного количества ключей, которые заполняются в профилактических целях.Теперь в цикле я должен проверить каждый ключ, чтобы заменить значение в случае, если оно должно быть изменено.

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

Я также подумал о arrayList длячтобы улучшить время вставки, но в этом случае поиск будет медленнее, и я потеряю функцию ключ-значение.Что если я отсортирую массив по ключу в начале, а затем поищу значения с помощью двоичного поиска?

Есть ли лучшее решение для поиска и записи на карте?

Спасибо,

РЕДАКТИРОВАТЬ: код

  for (Entry<String, VariableInfo> entry : VariablesMap.entrySet()){

  String varName = entry.getKey();
  VariableInfo info = entry.getValue();

  Object value = info.convertToValue();

        DialogWait dialogWindow = new DialogWait();                     
        SwingWorker<Void, Void> swingWorker = new SwingWorker<Void, Void>() {

            @Override
            protected Void doInBackground() throws Exception {

                while(newTimeSet != _record.getCurrentTimeMs()) {

                    _record.stepForward();

                    if(valuesMap.get(varName)!=value)
                        valuesMap.put(varName, value);
                }
                dialogWindow.close();
                return null;
            }
        };

        swingWorker.execute();          
        dialogWindow.makeWait("Loading");                   
}

1 Ответ

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

Теперь в цикле я должен проверить каждый ключ, чтобы заменить значение в случае, если оно должно быть изменено.

Есть ли способ обновить список, если условие, что значение должно измениться, становится истинным? В общем, можете ли вы переписать код вне карты, чтобы реагировать на изменения, а не периодически менять карту в зависимости от состояния? Как правило, это довольно сильное улучшение производительности и сделает вашу карту более полезной, поскольку она намного более актуальна.

Если вы действительно должны периодически проверять каждую запись на карте, тогда у вас есть время выполнения O(n) с использованием map.entrySet() и повторением по нему. Его нельзя оптимизировать, предполагая, что вы не можете предсказать информацию о введенных сопоставлениях.

Если у вас есть определенные записи, которые изменяются с большей частотой или вероятностью, вы можете оптимизировать их, применив там более высокую контрольную частоту, чем для остальных. Для этого вы можете использовать LinkedHashMap. С его помощью вы можете вставлять элементы, а список отслеживает порядок вставки. С его помощью вы можете легко запомнить последние n измененные элементы и расставить их приоритеты над другими.

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