2010-09-28 2 views
19

Мне нужна комбинация Google Collection ImmutableMap и LinkedHashMap — неизменяемая карта с определенным порядком итерации. Кажется, что сама ImmutableMap фактически определила порядок итерации, по крайней мере its documentation says:Google Collections ImmutableMap итерационный заказ

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

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

Мой вопрос: могу ли я рассчитывать на порядок итераций ImmutableMap? Если я сделаю ImmutableMap.copyOf(linkedHashMap), будет ли он иметь тот же порядок итераций, что и исходная связанная хэш-карта? Как насчет неизменяемых карт, созданных строителем? Некоторая ссылка на авторитетный ответ помогла бы, так как Google не нашел ничего полезного. (И нет, ссылки на источники не учитываются).

+0

Я верю, что коллекции теперь были сложены в библиотеку Гуавы. Но документация для ImmutableMap там же. – Thilo

ответ

17

Чтобы быть более точным, методы фабрики ImmutableMap и экземпляры построителя построят, следуя порядку итерации входов, предоставляемых при построенная карта. Тем не менее, ImmutableSortedMap, который является подклассом ImmutableMap. сортирует ключи.

4

Вы должны поверить в javadoc. Если этого недостаточно, прочитайте исходный код или сообщите об ошибке.

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

19

Я действительно нашел обсуждение по этому поводу, с answers from library authors:

Кевин Bourrillion: То, что мы подразумеваем под «указанный пользователем» «это может быть любой заказ вы хотите, чтобы быть»; другими словами, независимо от того, какой заказ вы предоставили нам в , это тот порядок, который мы используем.

Jared Levy: Вы также можете скопировать TreeMap или LinkedHashMap, которые имеют желаемый порядок.

Да, я должен был поверить в javadoc, хотя я думаю, что javadoc может быть лучше в этом случае. Кажется, я не первый, кого это смутило. Если ничего другого, этот Q/A поможет Google в следующий раз, когда кто-то будет искать «Истеризацию ImmutableMap» :-)

+3

+1 Я согласен с вами в том, что JavaDoc может быть более понятным. Вероятно, нет другой интерпретации для «надежного заданного пользователем порядка итераций», но небольшое избыточное замечание о методе copyOf(), которое сохранит порядок итерации исходной карты, не повредит. Семейство методов of() имеет такой комментарий («Возвращает неизменяемую карту, содержащую данные записи, в порядке».) – Thilo

+0

@Thilo: ах, я не заметил этих комментариев для методов(). Благодарю. –