在Ruby中,从数组的数组中找到所需值的真正方法是什么?



我有一个Ruby数组的数组:

price_list = [
  ['Brand-1', 'Model-1', 100.00],
  ['Brand-1', 'Model-2', 200.00],
  ['Brand-2', 'Model-1', 10.00],
  ['Brand-2', 'Model-2', 20.00],
  ['Brand-1', 'Model-1', 110.00],
  ['Brand-1', 'Model-2', 190.00],
  ['Brand-1', 'Model-3', 300.00],
  ...
  ['Brand-n', 'Model-n', 1234.00]
]

我需要创建一个只有唯一产品和最小价格的新数组。像这样:

new_price_list = [
  ['Brand-1', 'Model-1', 100.00],
  ['Brand-2', 'Model-1', 10.00],
  ['Brand-2', 'Model-2', 20.00],
  ['Brand-1', 'Model-2', 190.00],
  ['Brand-1', 'Model-3', 300.00],
  ...
  ['Brand-n', 'Model-n', 1234.00]
]
在Ruby中,最快、最漂亮的方法是什么?

按键(品牌+型号)分组,然后获得分组数组的最小价格:

prices = [
  ['Brand-1', 'Model-1', 100.00],
  ['Brand-1', 'Model-2', 200.00],
  ['Brand-2', 'Model-1', 10.00],
  ['Brand-2', 'Model-2', 20.00],
  ['Brand-1', 'Model-1', 110.00],
  ['Brand-1', 'Model-2', 190.00],
  ['Brand-1', 'Model-3', 300.00],
]
grouped = prices.group_by { |brand, model, price| [brand, model] }
grouped.values.map { |grouped_prices| grouped_prices.min_by(&:last) }
输出:

[["Brand-1", "Model-2", 190.0],
 ["Brand-1", "Model-3", 300.0],
 ["Brand-2", "Model-1", 10.0],
 ["Brand-2", "Model-2", 20.0],
 ["Brand-1", "Model-1", 100.0]]
items = Hash.new()
price_list.each{|brand,model,price|
     item=items[brand+model]
     items[brand+model]=[brand,model,price] if (!item||item[2]>price)
}

如果您不需要按品牌和型号进行排序,则可以这样做:

new_price_list = price_list.sort_by { |brand,model,price| price }.uniq {|brand, model, price| [brand, model] }

如果你想让它也排序,你必须再次排序

new_price_list = price_list.sort_by { |brand,model,price| brand + model }.sort_by { |brand,model,price| price }.uniq {|brand, model, price| [brand, model] }

编辑:uniq with block将只在ruby 1.9中工作

根据api文档

,使用new_price_list = price_list & Array.new(price_list)应该返回一个新的数组,其中所有元素都是两个集合的唯一元素。

Set intersection——返回一个新的数组,该数组包含对象的公共元素两个数组,没有重复项。

相关内容

  • 没有找到相关文章

最新更新