Groovy: как сгруппировать значения сопоставления по 2 различным критериям?

Как я могу сгруппировать значения карт по 2 различным критериям, чтобы получить результаты, указанные ниже?

def listOfMaps = [
  [name:'Clark', city:'London', hobby: 'chess'], [name:'Sharma', city:'London', hobby: 'design'],
  [name:'Maradona', city:'LA', hobby: 'poker'], [name:'Zhang', city:'HK', hobby: 'chess'],
  [name:'Ali', city: 'HK', hobby: 'poker'], [name:'Liu', city:'HK', hobby: 'poker'],
  [name:'Doe', city:'LA', hobby: 'design'], [name:'Smith', city:'London', hobby: 'poker'],
  [name:'Johnson', city: 'London', hobby: 'poker'], [name:'Waters', city:'LA', hobby: 'poker'],
  [name:'Hammond', city:'LA', hobby: 'design'], [name:'Rogers', city:'LA', hobby: 'chess'],
]
  1. порядок групп: хобби, город

     покер
    Лондон
    Смит
    Джонсон
    ЛА
    Марадона
    Воды
    HK
    Али
    Лю
    дизайн
    Лондон
    Шарма
    ЛА
    Лань
    Hammond
    HK
    шахматы
    Лондон
    Кларк
    ЛА
    Роджерс
    HK
    Чжан
    
  2. групповой порядок: город, хобби

     Лондон
    покер
    Смит
    Джонсон
    дизайн
    Шарма
    шахматы
    Кларк
    ЛА
    покер
    Марадона
    Воды
    дизайн
    Лань
    Hammond
    шахматы
    Роджерс
    HK
    покер
    Али
    Лю
    дизайн
    шахматы
    Чжан
    

Изменить:

Что мне действительно нужно, так это способ итерации, чтобы эффективно перебирать структуру группы и иметь возможность построить результат (группа / подгруппа / имя).

Примерно так:

  1. для каждой группы распечатать / вывести имя группы;
  2. для каждой подгруппы внутри группы, распечатать / вывести имя подгруппы
  3. внутри каждой подгруппы, распечатать имена.

Это дало бы результат, описанный выше.

В качестве приятного момента я хотел бы отсортировать всю структуру данных (группы и имена).

6
задан Michel Parmentier 27 January 2012 в 07:45
поделиться