Groovy Набор ключей переменной GroupBy - PullRequest
0 голосов
/ 09 апреля 2020

Я борюсь с использованием groovy groupBy

Мне нужно поддержать группировку набора данных по набору переменных ключей.

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

https://groovyconsole.appspot.com/script/5155615986941952

List<Map> people = [
    [
        Sex: "Male",
        Age: 30,
        Job: "Programmer",
        Name: "Boris"
    ],
    [
        Sex: "Female",
        Age: 30,
        Job: "Programmer",
        Name: "Jennifer"
    ],
    [
        Sex: "Male",
        Age: 40,
        Job: "Web Designer",
        Name: "Bob"
    ],
    [
        Sex: "Female",
        Age: 20,
        Job: "Database Admin",
        Name: "Alice"
    ]
]


List results = []
if(people.groupBy({it.Sex}, {it.Age}) != groupBySpecifiedCols(people, ["Sex", "Age"])){
  return "Failed 1"
}

if(people.groupBy({it.Sex}, {it.Age}, {it.Job}) != groupBySpecifiedCols(people, ["Sex", "Age", "Job"])){
  return "Failed 2"
}

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  // IMPLEMENT HERE

  return null
}


return "Success!"​​​​

1 Ответ

2 голосов
/ 09 апреля 2020

На самом деле, я думаю, что только что решил, после многих часов разочарования все оказалось просто:

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  List<Closure> groupByClosures = []
  columns.each{ column ->
    groupByClosures << { it[column] }
  }

  return data.groupBy(groupByClosures)
}

РЕДАКТИРОВАТЬ , как указано в комментариях, есть потенциально более краткий способ:

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  return data.groupBy(columns.collect{ col -> ((Closure){ it[col] })})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...