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

如何在groovy中对多值列表进行排序?,groovy,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, Custo

我有下面的值列表

[
[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中按客户名称的字母顺序进行排序。

您可以通过向
排序方法传递闭包来使用自定义排序顺序,如下所述:

list.sort{a,b->
a、 价格b.价格?:a.姓氏b.姓氏
}
“spaceship operator”(
)调用用于排序的
比较方法。当两个比较项相等时,返回0。这就是elvis操作符(
?:
)的作用:它将前面的表达式求值为
布尔值(根据groovy Truthynes),如果它是
真值,则返回它的值。由于0的计算结果为false,因此将返回elvis运算符后面的表达式


因此,如果价格不相等(
a.price b.price
不是0),则使用
a.price b.price
的结果进行排序。但是如果它们相等,则a.lastName b.lastName
用于排序。

如果直接排序呢

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
}
invoices.sort{a,b->
如果(a.价格>b.价格)返回-1
如果(a.价格b.“客户名称”)?-1:1
}

大家好,欢迎来到Stackoverflow。为了让您的问题更容易回答,请下次查看格式选项:。还要尝试提供有效的代码。例如,下次使用“[”发票号:452170]”而不是“[发票号:452170]”。这样可以轻松地将代码粘贴到编辑器中并验证答案。这些东西使阅读和回答问题变得更容易,你会得到更快更好的答案;)谢谢你的解决方案。它起作用了,但价格是按升序排序的,如何按降序排序。谢谢。切换位置:
b.price a.price
再次感谢,但仍然无法获得预期的排序。(按价格降序排序,然后按字母顺序按客户名称排序)。预计订单库存编号:452171 | Dt:13-04-2014 |价格:453212.0 |客户名称:大卫·鲍伊库存编号:452170 | Dt:12-05-2016 |价格:124589.0 |客户名称:大卫·科波菲尔库存编号:452173 | Dt:21-05-2017 |价格:47852.0 |客户名称:大卫·科雷什库存编号:452172 | Dt:24-07-2013 12458 12458 |客户名称:大卫·贝克汉姆代码:l.sort{a,b->b.'Price'a.'Price'?:a.'Customer Name'b.'Customer Name'}是数字类型的价格吗?在将我正在解析的值添加到double时,确保它们不是strings。如何验证价格的数据类型?谢谢。以上根据价格或名称进行排序。
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
}