Сортировка массива структур - PullRequest
2 голосов
/ 20 мая 2010

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

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

Два вопроса:

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

Ответы [ 2 ]

7 голосов
/ 20 мая 2010

1.

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

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

Это просто указывает, что мы сравниваем a и b, используя [: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 , он предоставит и другие операторы сравнения.

2 голосов
/ 20 мая 2010

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

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

leaders.sort_by {|l| l.rank}

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

leaders.sort_by {|l| [l.rank, l.user.created_at]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...