按 Groovy 中的自然顺序对列表进行排序
Sort list in natural order in Groovy
尝试按自然/人类可读顺序对字符串列表进行排序(升序)。如下所示。
def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5']
list.sort()
我可以在 GitHub 中找到示例 java 代码。但正在寻找 groovy 方式。感谢任何帮助。
期望输出:
f1, f2, f3, f5, f10, f12, f20, f22, f34, f50
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]
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]
您还可以使用以下比较器:
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]
尝试按自然/人类可读顺序对字符串列表进行排序(升序)。如下所示。
def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5']
list.sort()
我可以在 GitHub 中找到示例 java 代码。但正在寻找 groovy 方式。感谢任何帮助。
期望输出:
f1, f2, f3, f5, f10, f12, f20, f22, f34, f50
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]
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]
您还可以使用以下比较器:
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]