Groovy Schwartzian变换

时间:2011-05-10 22:18:27

标签: groovy

有人可以在Groovy中建议更简单,更优雅的Perl Schwartzian Transform实现吗?

def unsorted = [7, 3, 109, 22, 55]
def sortCriterion = { it + 1 }
def sorted = unsorted.inject([:],{map, v -> map << [(v):sortCriterion(v)]}).sort{it.value}.collect{k,v->k}
assert sorted == [ 3, 7, 22, 55, 109]

例如,必须有更好的方法从有序地图中获取密钥。

3 个答案:

答案 0 :(得分:3)

这是我的看法:

def sorted = unsorted.groupBy(sortCriterion).sort().values().flatten()

答案 1 :(得分:1)

你可以这样做:

def sorted = unsorted.collectEntries { v -> [ (v):sortCriterion( v ) ] }.sort { it.value }.keySet() as List

假设您使用的是Groovy 1.8(适用于collectEntries方法)

答案 2 :(得分:1)

如果有人关心,实际的字面翻译将是

unsorted.collect{[it,sortCriterion(it)]}.sort{it[1]}.collect{it[0]}