有人可以在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]
例如,必须有更好的方法从有序地图中获取密钥。
答案 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]}