使用Ruby中的属性对对象列表进行排序

Kyl*_*tan 5 ruby sorting idioms

我有一个Fruit名为的结构列表basket.每个Fruit结构都有一个name(一个字符串)和一个calories(一个整数).我想这样排序basket:

  1. Fruit最高的s calories首先出现.例如,含400卡路里的水果出现在400卡路里的水果之前.

  2. 如果两个Fruit■找相等calories,则Fruitname是第一位字母是第一位的,不区分大小写.例如,给定两个具有相同卡路里的水果,一个名为"香蕉"的水果将在一个名为"柑橘"之前出现.

定义Fruit不是我控制的,所以我更喜欢一种不涉及混合Fruit或改变它的解决方案.这可能吗?

Gar*_*eth 12

简单的解决方案是

basket.sort_by { |f| [-f.calories, f.name] }
Run Code Online (Sandbox Code Playgroud)

当然,如果这是水果规范排序,则应使用该<=>方法并将Comparable模块混合到其中进行定义Fruit

  • 做case case ignore,交换f.name.downcase (3认同)