Сохранить порядок с неизменной картой? - PullRequest
3 голосов
/ 20 сентября 2019

При использовании java.util.Map.of(), не сохраняет порядок.Есть ли способ иметь неизменный Map, который сохраняет порядок?

Ответы [ 3 ]

5 голосов
/ 20 сентября 2019

Я считаю, что вы ищете LinkedHashMap .Связанный Hashmap похож на обычный HashMap, который сохраняет порядок вставки.

3 голосов
/ 20 сентября 2019

tl; dr

Создайте LinkedHashMap, заверните вызовом Collections.umodifiableMap, как обсуждено в Неизменяемые представления коллекций .

Map.of неизменяемые статические фабричные карты

Реализация Map, используемая методами Map.of, четко документирована в Javadoc.Один из пунктов указывает на то, что ключи не отсортированы:

Неизменяемые карты

Порядок итераций сопоставлений не определен и может быть изменен.

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

SortedMap

By "Порядок сохранения"Вы имели в виду отсортированный порядок?

Java включает интерфейс SortedMap для определения поведения реализаций Map, которые поддерживают общее упорядочение по всем его ключам.

В Java есть две такие реализации: TreeMap и ConcurrentSkipListMap.

Исходный порядок вставки сохранен

Ваш вопрос неясен, но я думаю, что вы подразумевали под "сохранить порядок", что вы хотите сохранить ключ в том порядке, в котором они были добавленына карту.LinkedHashMap делает именно это, как указано в правильном ответе randypaq13 .

Чтобы процитировать Javadoc:

… предсказуемый порядок итераций…

… поддерживает двусвязный список, проходящий через все его записи.Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки).Обратите внимание, что порядок вставки не изменяется, если ключ повторно вставлен в карту.

Неизменяемые карты

LinkedHashMap соответствует вашей потребности в исходном порядке размещения, но не вашей потребности в неизменяемости.Для этого используйте класс Collections с его утилитарным методом unmodifiableMap.

Map< String , String > map = new LinkedHashMap<>() ;
map.put( "this" , "that" ) ;
map.put( "other" , "thing" ) ;
Map< String , String > unmodMap = Collections.unmodifiableMap( map ) ;

Обязательно изучите документацию по Unmodifiable View Collections , чтобы понять их поведение.Нажмите, чтобы увеличить.


Вот таблица с обзором всех реализаций Map, связанных с Java 11.

Table of various classes bundled with Java that implement the Map interface and various sub-interfaces.

3 голосов
/ 20 сентября 2019

Следующее НЕ сохраняет порядок:

Map.of("a", 1, "b", 2); 

Если вы хотите иметь неизменяемый заказ Map, то вы должны пойти по этому окольному пути:

var map = new LinkedHashMap<String, String>();
map.put("a", 1);
map.put("b", 2);
map = Collections.unmodifiableMap(map);

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

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