Отсортируйте список объектов при помощи их атрибутов в Ruby

Каждый узел в Cassandra должен связываться с отдельным IP-адресом, даже на физических серверах или докерах, на которых работают 2 экземпляра / узла.

5
задан Kyle Kaitan 12 May 2009 в 13:14
поделиться

4 ответа

Простое решение -

basket.sort_by { |f| [-f.calories, f.name] }

Конечно, если это канонический порядок сортировки фруктов, то он должен быть определен с помощью ] <=> и с модулем Comparable , смешанным в Fruit

12
ответ дан 18 December 2019 в 10:48
поделиться

Предположим, ваша корзина является массивом или его подклассом. .

Быстрый способ

Enumerable.sort_by

Как указал Гарет , Enumerable (включенный в Array) имеет метод sort_by, который проходит через каждый элемент списка один раз. Это быстрее запускается и быстрее писать, как только вы освоите его.

# -f.calories to sort descending
# name.downcase to do a case-insensitive sort
basket = basket.sort_by { |f| [-f.calories, f.name.downcase] }

Путь на Perl

Array.sort

Исходя из опыта работы с Perl, мой первый импульс - воспользоваться оператором космического корабля <=> , Нахальный маленький дьяволенок. Массив имеет сортировку и сортировку! методы, которые делают его очень полезным. Это решение работает медленнее, и, поскольку оно длиннее, вероятность появления ошибок выше. Единственная причина использовать его - если вы имеете дело с людьми, незнакомыми с Ruby и не желающими найти правильный способ в StackOverflow.

baseket.sort! { |a,b|
  if a.calories == b.calories
    a.name.downcase <=> b.name.downcase
  else
    # Reverse the result to sort highest first.
    -(a.calories <=> b.calories)
  end
}
2
ответ дан 18 December 2019 в 10:48
поделиться

См. Array # sort ( Документ API ). Вы можете передать блок, который возвращает -1, 0 или 1 для двух объектов Fruit , и ваш блок может определять эти значения, используя любые атрибуты, которые вам нравятся.

1
ответ дан 18 December 2019 в 10:48
поделиться

Если вам нужно много сортировать фрукты, вам, вероятно, следует проделать немного больше работы и сделать ваши объекты сопоставимыми.

Для этого вам необходимо внедрить Spaceship-Operator ( <=> ) и включить Comparable.

class Fruit
  attr_accessor :name, :color

  def <=>(other)
    # use Array#<=> to compare the attributes
    [self.name.downcase, self.color] <=> [other.name.downcase, other.color]
  end

  include Comparable
end

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

list_of_fruits.sort

Comparable также предоставляет вам множество других методов ( == , < , > ) бесплатно, поэтому вы можете делать такие вещи, как if (apple (дополнительную информацию см. в документации для Comparable Module )

<=> указывается для возврата -1 , если self меньше, чем other , +1 , если other меньше и 0 , если оба объекта равны.

1
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: