根据多个键对地图列表进行排序
Sort list of maps based on multiple keys
我有 List
个 Map
看起来像这样:
[{type=UNL,date=20170606,publication=ECC,boNumber=34,value=500}
{type=UNP,date=20190807,publication=ECD,boNumber=24,value=100}
{type=UNA,date=20170606,publication=ECC,boNumber=34,value=400}
{type=UNC,date=20170606,publication=ECC,boNumber=34,value=300}
{type=UNF,date=20190807,publication=ECD,boNumber=24,value=200}]
对我来说最重要的字段是 date,publication,boNumber
的值,例如 20170606 ECC 34
。我想使用这三个字段一起对 List
进行排序。
预期结果
[{type=UNL,date=20170606,publication=ECC,boNumber=34,value=500}
{type=UNA,date=20170606,publication=ECC,boNumber=34,value=400}
{type=UNC,date=20170606,publication=ECC,boNumber=34,value=300}
{type=UNP,date=20190807,publication=ECD,boNumber=24,value=100}
{type=UNF,date=20190807,publication=ECD,boNumber=24,value=200}]
如何使用 groovy、dataweave 或 Java 在 mule 中实现。
你要的是.sort { [it.date, it.publication, it.boNumber] }
.
def listOfMaps = [[type:'UNL',date:20170606,publication:'ECC',boNumber:34,value:500],
[type:'UNP',date:20190807,publication:'ECD',boNumber:24,value:100],
[type:'UNA',date:20170606,publication:'ECC',boNumber:34,value:400],
[type:'UNC',date:20170606,publication:'ECC',boNumber:34,value:300],
[type:'UNF',date:20190807,publication:'ECD',boNumber:24,value:200]]
listOfMaps
.each { println it }
println()
listOfMaps
.sort { [it.date, it.publication, it.boNumber] }
.each { println it }
例如输出
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]
您可以使用 Dataweave 来实现这一点
%dw 1.0
%output application/json
---
payload orderBy ($.date ++ $.publication ++ $.boNumber)
希望对您有所帮助。
Groovy 的解决方案如下所示:
List list = [[type: 'UNL', date: '20170606', publication: 'ECC', boNumber: 34, value: 500],
[type: 'UNP', date: '20190807', publication: 'ECD', boNumber: 24, value: 100],
[type: 'UNA', date: '20170606', publication: 'ECC', boNumber: 34, value: 400],
[type: 'UNC', date: '20170606', publication: 'ECC', boNumber: 34, value: 300],
[type: 'UNF', date: '20190807', publication: 'ECD', boNumber: 24, value: 200]]
List sorted = list.sort { a,b ->
a.date == b.date ?
(a.publication == b.publication ?
a.boNumber <=> b.boNumber :
a.publication <=> b.publication) :
a.date <=> b.date
}
sorted.each { println it }
传递给 .sort()
方法的闭包执行以下操作:
- 首先它按
date
字段排序
- 然后如果两个日期相等,则检查
publication
字段是否相等
- 然后如果两个
publication
字段相等,则按 boNumber
排序
- 否则按
publication
排序
输出
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]
我有 List
个 Map
看起来像这样:
[{type=UNL,date=20170606,publication=ECC,boNumber=34,value=500}
{type=UNP,date=20190807,publication=ECD,boNumber=24,value=100}
{type=UNA,date=20170606,publication=ECC,boNumber=34,value=400}
{type=UNC,date=20170606,publication=ECC,boNumber=34,value=300}
{type=UNF,date=20190807,publication=ECD,boNumber=24,value=200}]
对我来说最重要的字段是 date,publication,boNumber
的值,例如 20170606 ECC 34
。我想使用这三个字段一起对 List
进行排序。
预期结果
[{type=UNL,date=20170606,publication=ECC,boNumber=34,value=500}
{type=UNA,date=20170606,publication=ECC,boNumber=34,value=400}
{type=UNC,date=20170606,publication=ECC,boNumber=34,value=300}
{type=UNP,date=20190807,publication=ECD,boNumber=24,value=100}
{type=UNF,date=20190807,publication=ECD,boNumber=24,value=200}]
如何使用 groovy、dataweave 或 Java 在 mule 中实现。
你要的是.sort { [it.date, it.publication, it.boNumber] }
.
def listOfMaps = [[type:'UNL',date:20170606,publication:'ECC',boNumber:34,value:500],
[type:'UNP',date:20190807,publication:'ECD',boNumber:24,value:100],
[type:'UNA',date:20170606,publication:'ECC',boNumber:34,value:400],
[type:'UNC',date:20170606,publication:'ECC',boNumber:34,value:300],
[type:'UNF',date:20190807,publication:'ECD',boNumber:24,value:200]]
listOfMaps
.each { println it }
println()
listOfMaps
.sort { [it.date, it.publication, it.boNumber] }
.each { println it }
例如输出
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]
您可以使用 Dataweave 来实现这一点
%dw 1.0
%output application/json
---
payload orderBy ($.date ++ $.publication ++ $.boNumber)
希望对您有所帮助。
Groovy 的解决方案如下所示:
List list = [[type: 'UNL', date: '20170606', publication: 'ECC', boNumber: 34, value: 500],
[type: 'UNP', date: '20190807', publication: 'ECD', boNumber: 24, value: 100],
[type: 'UNA', date: '20170606', publication: 'ECC', boNumber: 34, value: 400],
[type: 'UNC', date: '20170606', publication: 'ECC', boNumber: 34, value: 300],
[type: 'UNF', date: '20190807', publication: 'ECD', boNumber: 24, value: 200]]
List sorted = list.sort { a,b ->
a.date == b.date ?
(a.publication == b.publication ?
a.boNumber <=> b.boNumber :
a.publication <=> b.publication) :
a.date <=> b.date
}
sorted.each { println it }
传递给 .sort()
方法的闭包执行以下操作:
- 首先它按
date
字段排序 - 然后如果两个日期相等,则检查
publication
字段是否相等 - 然后如果两个
publication
字段相等,则按boNumber
排序
- 否则按
publication
排序
输出
[type:UNL, date:20170606, publication:ECC, boNumber:34, value:500]
[type:UNA, date:20170606, publication:ECC, boNumber:34, value:400]
[type:UNC, date:20170606, publication:ECC, boNumber:34, value:300]
[type:UNP, date:20190807, publication:ECD, boNumber:24, value:100]
[type:UNF, date:20190807, publication:ECD, boNumber:24, value:200]