2013-06-19 2 views
1

У меня есть структураСортировка 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">] 

Теперь я хотите, чтобы структура сортировалась по атрибуту страницы (сначала с наименьшим).

+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, например [[# , # , # ]] – 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 в зависимости от того, какой критерий? –

Смежные вопросы