Я решил проблему, которая ранжирует фрукты по количеству голосов.К сожалению, я хочу решить проблему чисто функциональным способом без изменения переменной rankPosition.Вот мое решение:
def fruits=[
[name:'apple', votes:120 , ranking:null ],
[name:'banana', votes:200, ranking: null],
[name:'apricot', votes:66, ranking:null ],
[name:'pear', votes:84, ranking:null],
[name:'kiwi', votes:77, ranking:null],
[name:'plum', votes:66, ranking:null],
[name:'berry', votes:120, ranking:null],
[name:'pineapple', votes:50, ranking:null],
[name:'grapes', votes:200, ranking:null]
]
def rankPosition= 1
def groupedByVotes = fruits.groupBy {it.votes }
println "Ratings $groupedByVotes"
def finalResults=groupedByVotes.sort().each { votes, items ->
items.each { it.ranking = rankPosition }
rankPosition += items.size()
}
println "Final Results are $finalResults"
Как я могу решить эту проблему, не объявляя переменную RankingPosition, внешнюю по отношению к замыканию, и изменяя ее состояние.Обратите внимание, что это решение работает, но с тех пор я узнал, что не должен делать это таким образом.Я хочу иметь возможность заполнить рейтинги с правильным рейтингом.Функция инъекции выполняет накопление, но я не знаю, как объединить ее таким образом, чтобы также установить ранжирование со значением, накопленным в инъекции.
Я просто застрял, но, кажется, нев состоянии рассуждать об этом.Моя попытка использовать инъекцию ниже просто не сработала.Может быть, нет способа сделать это чисто функциональным способом, лучше, чем моя попытка.
def res= groupedByVotes.collectEntries{votes, list1->
println "list class $list1"
def r= list1.inject(0){acc,l-> acc+l.size()}
list1.each{it.ranking=r}
println "$r"
[(votes): list1]
}
println "$res"
Тогда я, любой, мог бы оценить ваше решение или просто предположить, что моя попытка является наиболее реалистичным способомрешая это.