如何在Groovy中对多值列表进行排序?

时间:2018-08-17 11:33:23

标签: groovy

我的列表中包含以下值

[
[Invoice Number:452170, Date:12-05-2016, Price:124589.0, Customer Name:David Copperfield], 
[Invoice Number:452171, Date:13-04-2014, Price:453212.0, Customer Name:David Bowie], 
[Invoice Number:452172, Date:24-07-2013, Price:21458.0, Customer Name:David Beckham], 
[Invoice Number:452173, Date:21-05-2017, Price:47852.0, Customer Name:David Koresh]
]

我想按价格降序对列表进行排序,然后按常规字母顺序按客户名称排序。

2 个答案:

答案 0 :(得分:1)

您可以通过将闭包传递给sort方法来使用自定义排序顺序,如下所述:TO THE NEW - Groovier way of sorting over multiple fields in a list of maps in groovy

list.sort { a,b ->
   a.price <=> b.price ?: a.lastName <=> b.lastName
}

“太空飞船运营商”(<=>)调用用于分类的compareTo方法。当两个比较项相等时,它返回0。这是elvis运算符(?:)出现的地方:它将运算符之前的表达式评估为boolean(根据常规真实性),如果表达式为true,则返回其值。由于0的计算结果为false,因此将返回elvis运算符后面的表达式。

因此,如果价格不相等(a.price <=> b.price不为0),则将a.price <=> b.price的结果用于排序。但是如果它们相等,a.lastName <=> b.lastName用于排序。

答案 1 :(得分:0)

如果您进行直接排序怎么办?

invoices.sort { a, b ->
    if (a.Price > b.Price) return -1
    if (a.Price < b.Price) return 1
    else
        return (a.'Customer Name' > b.'CustomerName') ? -1 : 1
}