如何在Ruby中执行复杂的自定义排序?

如何在Ruby中执行复杂的自定义排序?,ruby,sorting,Ruby,Sorting,我有一个如下所示的数组: [ { type: 'A', price: '0.01' }, { type: 'B', price: '4.23' }, { type: 'D', price: '2.29' }, { type: 'B', price: '3.38' }, { type: 'C', price: '1.15' } ] boards.sort_by {|e| [e['type'], e['price'].to_f]} 我需要按类型对它们进行分组,然后按价格升序对

我有一个如下所示的数组:

[
  { type: 'A', price: '0.01' },
  { type: 'B', price: '4.23' },
  { type: 'D', price: '2.29' },
  { type: 'B', price: '3.38' },
  { type: 'C', price: '1.15' }
]
boards.sort_by {|e| [e['type'], e['price'].to_f]}
我需要按
类型对它们进行分组,然后按
价格升序对它们进行排序。通过执行以下操作,我可以一半解决此问题:

[
  { type: 'A', price: '0.01' },
  { type: 'B', price: '4.23' },
  { type: 'D', price: '2.29' },
  { type: 'B', price: '3.38' },
  { type: 'C', price: '1.15' }
]
boards.sort_by {|e| [e['type'], e['price'].to_f]}
不幸的是,当应该对
BADC


如何按照预先确定的规则对数组进行排序?

[edit]问题不清楚。这就是我的理解:按ASC价格订购电路板,但对于同一类型的电路板,只能买到最便宜的。使用Facets的抽象(也在ActiveSupport中:):

输出:

[{:type=>"A", :price=>"0.01"},
 {:type=>"C", :price=>"1.15"},
 {:type=>"D", :price=>"2.29"},
 {:type=>"B", :price=>"3.38"}]
[{:type=>"B", :price=>"3.38"},
 {:type=>"B", :price=>"4.23"},
 {:type=>"A", :price=>"0.01"},
 {:type=>"D", :price=>"2.29"},
 {:type=>"C", :price=>"1.15"}]
输出:

[{:type=>"A", :price=>"0.01"},
 {:type=>"C", :price=>"1.15"},
 {:type=>"D", :price=>"2.29"},
 {:type=>"B", :price=>"3.38"}]
[{:type=>"B", :price=>"3.38"},
 {:type=>"B", :price=>"4.23"},
 {:type=>"A", :price=>"0.01"},
 {:type=>"D", :price=>"2.29"},
 {:type=>"C", :price=>"1.15"}]
你使用“分组方式”一词让人困惑

如果要按类型排序,如果类型相等,则按价格排序,可以执行以下操作:

boards.sort do |a, b|
  type_order = a[:type] <=> b[:type]
  if type_order != 0
    type_order
  else
    a[:price] <=> b[:price]
  end
end
boards.sort do | a,b|
类型\顺序=a[:类型]b[:类型]
如果输入_订单!=0
订单类型
其他的
a[:价格]b[:价格]
结束
结束

如果没有,您需要更好地解释您想要什么。:-)

问题并不清楚:期望的产出是什么?对于同一类型的产品,能买到价格最低的吗?然后总是按价格ASC排序?我想他想按类型排序,如果类型相等,他想按价格排序。@sheldonh。但这正是他的代码所做的。然后,他说输出应该按“BADC”排序,这毫无意义(那里没有价格,也没有类型排序…),但无论如何,类型B似乎已经分组了,所以他真的需要一些分组。谁知道呢……首先,他的代码需要字符串键,而它应该需要符号。@tokland,很抱歉搞混了。我在沟通我的问题时遇到了困难。steenslag下面的解决方案就是我一直在寻找的。我认为,通过“BADC”,OP指的是预期的输出,而不是他事先知道的。但问题并不清楚。