在Groovy中按自然顺序排序列表

时间:2017-09-07 10:28:48

标签: groovy natural-sort

尝试按自然/人类可读顺序对字符串列表进行排序(升序)。像下面的东西。

def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5']
list.sort()

我可以在GitHub中找到示例java代码。但寻找时髦的方式。任何帮助表示赞赏。

期望的输出:

f1, f2, f3, f5, f10, f12, f20, f22, f34, f50

3 个答案:

答案 0 :(得分:3)

def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5', 'f9']
list.sort { it[1..-1] as int }​

结果:

[f1, f2, f3, f5, f9, f10, f12, f20, f22, f34, f50]

答案 1 :(得分:2)

def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5']
list.collect{ (it=~/\d+|\D+/).findAll() }.sort().collect{ it.join() }

结果:

[f1, f2, f3, f5, f10, f12, f20, f22, f34, f50]

答案 2 :(得分:1)

您还可以使用以下比较器:

list.sort { a,b -> a[0] <=> b[0] == 0 ?
        (a[1..-1] as int) <=> (b[1..-1] as int) :
        a[0] <=> b[0]
}

它首先比较文字,当它们相等时,它会比较数字部分。使用此方法与列表如:

['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5', 'g1', 'g11', 'z0', 'a00', 'a01']

生成以下结果:

[a00, a01, f1, f2, f3, f5, f10, f12, f20, f22, f34, f50, g1, g11, z0]