2010-05-19 4 views
1

У меня есть массив структур, называемых лидерами. Класс структура выглядит следующим образом, для контекстной информации:Сортировка массива структур

class Leader < Struct.new(:rank, :user); end 

Два вопроса:

  1. Как отсортировать массив по рангу структур?
  2. Как отсортировать массив структур по рангу и по user.created_at?

ответ

5

1.

Предполагая, что ранг числовая:

array.sort {| a, b | a[:rank] <=> b[:rank] } 

Это просто указав, что мы сравниваем а и Ь с помощью [:rank].

2.  

array.sort {| a, b | a[:rank] == b[:rank] ? 
    a[:user].created_at <=> b[:user].created_at : 
    a[:rank] <=> b[:rank] } 

Это использует трехкомпонентной. Если ряды равны, мы сравниваем [: user] .created_at. В противном случае мы сравниваем ряды.

Вы могли бы реализовать < => в собственном классе, чтобы обеспечить сортировку изначально:

class Leader < Struct.new(:rank, :user) 
    def <=>(other) 
    self[:rank] <=> other[:rank] 
    end 
end 

Тогда вы можете сделать:

leaders.sort() 

Если включить Comparable, это обеспечит другие операторы сравнения слишком.

1

Вот реализация с использованием sort_by. Как отмечено в документации, она может быть менее эффективной, чем версия, использующая сортировку, в зависимости от того, насколько дорого стоит получить значения rank и created_at.

Сортировка по рангу:

leaders.sort_by {|l| l.rank} 

Сортировка по рангу и created_at:

leaders.sort_by {|l| [l.rank, l.user.created_at]} 
Смежные вопросы