2013-06-19 48 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取決於什麼標準? –