Как лучше всего перебирать записи Hashtable БЕЗ API java.lang.Map? - PullRequest
3 голосов
/ 29 декабря 2010

Я работаю над реализацией Java BlackBerry j2me, у которой нет API коллекций. Таким образом, нет entrySet() метода или Map.Entry класса. Единственными доступными методами для перебора отображений Hashtable являются методы elements() и keys().

Можно ли ожидать, что elements() и keys() вернут одинаковое количество отображений в том же порядке? Если это так, я могу сделать следующее:

Enumeration keys = table.keys();
Enumeration elements = table.elements();
String key, value;
while(keys.hasMoreElements()) {
    key = keys.nextElement();
    value = elements.nextElement();
}

Я бы подумал, что это так, но документы не говорят наверняка. Если я не могу сделать это предположение, то мне придется перебирать только ключи:

Enumeration keys = table.keys();
String key, value;
while(keys.hasMoreElements()) {
    key = keys.nextElement();
    // Less efficient b/c I have to do a lookup every time.
    value = table.get(key);
}

Редактировать: Можно предположить, что только один поток имеет доступ к таблице.

1 Ответ

3 голосов
/ 29 декабря 2010

Они гарантированно вернут одно и то же число предметов.А в реализации Sun ключи и значения возвращаются в том же порядке.(На самом деле, под одеялом один и тот же класс служит для итерации по ключам, значениям или объектам Map.Entry.) Действительно, трудно представить получение значений каким-либо иным способом, чем итерированием по сегментам.* Однако в спецификации языка не указано, что они должны быть в одном и том же порядке, поэтому, если вы сделаете это предположение, вы затрудните переносимость и, возможно, позже обнаружите трудно обнаруживаемые ошибки.Я думаю, что это был эксперт по алгоритмам Дональд Кнут, который сказал: «Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла».Если эта конкретная часть кода не является огромным узким местом, я рекомендую вам выполнить поиск для каждого ключа.

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