根据多个键对地图列表进行排序

Sort list of maps based on multiple keys

我有 ListMap 看起来像这样:

[{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]