Сортированные карты в groovy - программирование

Сортированные карты в groovy

Мне интересно использовать отсортированную карту в groovy (с гремлином, который является DSL для баз данных графа).

Я просмотрел этот пост в блоге на отсортированных картах здесь, но я все еще немного смущен.

  • Как объявляются отсортированные карты? Разве это не отличается от стандартного способа для карт y = [:]?

  • При использовании сортированной карты элементы, вставленные в список, будут в том порядке, в котором они вставлены? Или мне нужно запустить sort{} до сортировки элементов сортированной карты?

4b9b3361

Ответ 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 не будет автоматически сортироваться при добавлении новых значений.