#java #iterator #hashmap
#java #итератор #hashmap
Вопрос:
У меня есть этот класс:
public class docInfo {
private int freq;
private HashMap<String, Double> m = new HashMap<String, Double>();
}
private Map<String, docInfo> m;
Я хочу перебрать все двойное значение docInfo и изменить его:
docInfo documento;
for (Map.Entry<String, docInfo> entry : m.entrySet()) {
word = entry.getKey();
docs = entry.getValue(); // docs map
for (Map.Entry<String, Double> entry2 : docs.getM().entrySet()){
score = entry2.getValue();
temp = score;
double log = Math.log10(docs.getFreq());
double tfw = log cons;
docs.changeScoreTo(entry2.getKey(), tfw);
//entry2.setValue(tfw);
}
}
Он работает, проблема в том, что его выполнение занимает слишком много времени, и я думаю, что мой код не подходит для этой работы. Любая помощь будет оценена,
Комментарии:
1. Сколько элементов в каждом
Map
? Сколько раз вызывается этот код?2. всего docInfo HashMap составляет 27 кб, большая часть основного hashmap содержит не более 20 объектов
Ответ №1:
Вы действительно должны использовать профилировщик, чтобы понять, почему код работает медленно. Это лучше, чем гадать. Однако, если бы мне пришлось угадывать, я бы сказал, что проблема в том, что очень большие карты (27 КБ) медленно создаются и извлекаются. Хэш-таблицы по умолчанию слишком малы для 27 тыс. записей, поэтому при сборке приходится много перефразировать.
Попробуйте
private HashMap<String, Double> m = new HashMap<String, Double>(5000);
И попробуйте профилировщик, чтобы сообщить нам, какие строки потребляют циклы.