2

我有以下值的列表

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

我想按价格的降序对该列表进行排序,然后按客户名称按字母顺序在 groovy 中排序。

4

2 回答 2

2

您可以通过将闭包传递给sort此处描述的方法来使用自定义排序顺序:TO THE NEW - Groovier way of sort 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(根据 groovy truthyness),如果是 ,则返回它的值true。由于 0 的计算结果为 false,因此返回 elvis 运算符后面的表达式。

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

于 2018-08-17T11:52:15.303 回答
1

如果你做直接排序怎么办?

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
}
于 2018-08-17T17:41:47.280 回答