Ответ 1
Если вы просто объявляете такую карту:
def m = [:]
Затем вы можете видеть, что Groovy по умолчанию делает LinkedHashMap
assert m.getClass().name == 'java.util.LinkedHashMap'
Если вы посмотрите документацию для LinkedHashMap, в нем говорится:
Таблица хэш-таблицы и связанный список интерфейса карты с предсказуемым порядком итерации. Эта реализация отличается от HashMap тем, что она поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки).
So LinkedHashMap
имеет порядок, и вы можете повлиять на этот порядок в Groovy, вызвав sort
def m = [ b:1, a:2 ]
// Sort by descending value
m = m.sort { -it.value }
println m // prints [a:2, b:1]
Если вы хотите естественный порядок ключей, вы можете использовать одну из сортированных карт Java, например TreeMap
Чтобы сказать, что вы хотите использовать это в Groovy, вы можете сделать:
// def tm = [ tim_yates:1, F21:2 ] as TreeMap // works as well
TreeMap tm = [ tim_yates:1, F21:2 ]
Затем, напечатав это, вы увидите, что он упорядочен клавишами:
println map // prints [F21:b, tim_yates:a]
A TreeMap
будет поддерживать порядок при добавлении ключей. A LinkedHashMap
не будет автоматически сортироваться при добавлении новых значений.