2013-06-19 47 views
1

我有结构排序结构上的多个属性

[#<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">] 

排序呢我希望结构按页面属性排序(最小的第一个)。

+0

您是否尝试过'sort_by'? http://ruby-doc.org/core-2.0/Enumerable.html#method-i-sort_by –

+0

你的问题有点不清楚。你想按照哪个标准对你的数组进行排序? –

+0

@undur_gongor OP想按降序对其进行排序。因为我正在查看输出 - *现在我想输出*部分。 –

回答

3

它不应该是简单的:

x.sort_by(&:page) 

如果您想通过几个属性进行排序,你可以不喜欢它:

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

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

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

+0

我希望价值按降序排列,页面按升序排列。 – prashantsahni

+0

如果p3,64应该在p2,64之后,并且p1 56应该在p3 56之后,比如[[#,#,#<结构页面=“P1”,值= 48,查询=“Q1”>]] – prashantsahni

+0

通常情况下,有人不反对这种荒谬的要求。 –

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">] 
+0

谢谢,但我想'P2'之前“P3” – prashantsahni

+1

@prashantsahni取决于什么标准? –