对多个属性进行排序

时间:2013-06-19 07:50:49

标签: ruby sorting struct

我有结构

[#<struct Page page="P3", value=64, query="Q1">, 
 #<struct Page page="P2", value=64, query="Q1">, 
 #<struct Page page="P1", value=48,    
 query="Q1">]

当我按值对其进行排序时(降序)

[#<struct Page page="P3", value=64, query="Q1">, #<struct Page page="P2", value=64, query="Q1">, #<struct Page page="P1", value=48, query="Q1">]

现在我想要输出

[#<struct Page page="P2", value=64, query="Q1">, #<struct Page page="P3", value=64, query="Q1">, #<struct Page page="P1", value=48, query="Q1">]

现在我希望结构按页面属性排序(首先是最小的)。

2 个答案:

答案 0 :(得分:3)

不应该简单地说:

x.sort_by(&:page)

如果要按多个属性排序,可以这样做:

x.sort_by{ | e | [e.page, e.value] }

x.sort_by{ | e | [-e.value, e.page] }

如果值具有更高的优先级并且要按降序排序。

答案 1 :(得分:2)

尝试以下方法:

s = Struct.new(:page, :value, :query)
a = [["P3", 64,"Q1"],["P2",64,"Q1"],["P1",48,"Q1"]]
a.map!{|i| s.new(*i)}

a.sort_by(&:page).reverse
#>>[#<struct page="P3", value=64, query="Q1">, #<struct page="P2", value=64, query="Q1">, #<struct page="P1", value=48, query="Q1">]

修改

按照你的说法使用以下内容:

a.sort_by{ | e | [-e.value, e.page] }
#=>[#<struct page="P2", value=64, query="Q1">, #<struct page="P3", value=64, query="Q1">, #<struct page="P1", value=48, query="Q1">]
相关问题