Отсортируйте набор объектов числом (самый высокий первый) затем по буквам (алфавитный)

Я создаю виджет, чтобы показать, что медаль значит Олимпийские игры. У меня есть набор объектов "страны", где у каждого есть атрибут "имени", и "золото", "серебро", "бронза" для количеств медали.

Список должен быть отсортирован: 1. Сначала общим количеством 2 медали. Если те же медали, подвид типом (золото> серебро> бронза, т.е. два золотых медалей> 1 золото + 1 серебро) 3. Если те же медали и тип, подвид в алфавитном порядке

Я делаю это в рубине, но я предполагаю, что язык не имеет значения. Я действительно выяснял решение, но если чувствует, что должен быть намного более изящный способ сделать это.

Вот то, что я сделал:

  1. Создайте виртуальный атрибут со взвешенным общим количеством медали. Таким образом, если бы они имели 2 золота и 1 серебряное, взвесили общее количество, то был бы "3.020100". 1 золото и 1 серебро и 1 бронза были бы "3.010101"

  2. Так как мы хотим отсортировать количество медали как самое высокое первый, список отсортирован DESC. Но затем мы хотим подотсортировать в алфавитном порядке (т.е. ASC) после этого. Таким образом, я создал функцию, которая будет альфа-инвертирование слово (т.е. "Канада" => "xzmzwz")

  3. Преобразуйте взвешенное общее количество в строку, concat обратное имя (т.е. "3010101xzmzwz"), затем убывание вида. Вуаля.

К настоящему времени кто-то выяснил, как выполнить в том же самом приблизительно 2 строки кода. Хотеть просветить меня?

5
задан dlehman 9 February 2010 в 20:59
поделиться

3 ответа

countries.sort_by do |country|
  medals = country.gold + country.silver + country.bronze
  [-medals, -country.gold, -country.silver, country.name]
end
10
ответ дан 13 December 2019 в 19:27
поделиться

Я уже довольно долго использую PostSharp и должен сказать, что я пользуюсь простотой использования и простотой реализации.

Я должен также добавить, что лично, когда я использую структуру, я всегда стараюсь придерживаться единой структуры ответственности, если только эта структура не содержит много компонентов, которые мне нужны или комплиментарны ядру.

-121--3190189-

Попробуйте плагин show _ sql . Плагин позволяет печатать SQL без его запуска

SampleModel.sql(:select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
-121--704936-

В Java вы бы реализовали сравнимый объект, а затем его можно было бы легко отсортировать в ArrayList или Array. Есть ли в Ruby механизм, который поможет сравнить два ваших объекта «Страна»?

0
ответ дан 13 December 2019 в 19:27
поделиться

Простой метод - использовать sort_by с некоторой строкой произвольного формата, например:

countries.sort_by do |c|
  "%010d-%010d-%010d-%s" % [ c.gold, c.silver, c.bronze, c.name ]
end

Это преобразует все страны в сортируемый список ASCII, добавляя количество завоеванных медалей до предположительно безумных 10 мест. Если кто-то выиграет более десяти миллиардов медалей, ваша программа может дать сбой, но это кажется разумным ограничением.

1
ответ дан 13 December 2019 в 19:27
поделиться