Я создаю виджет, чтобы показать, что медаль значит Олимпийские игры. У меня есть набор объектов "страны", где у каждого есть атрибут "имени", и "золото", "серебро", "бронза" для количеств медали.
Список должен быть отсортирован: 1. Сначала общим количеством 2 медали. Если те же медали, подвид типом (золото> серебро> бронза, т.е. два золотых медалей> 1 золото + 1 серебро) 3. Если те же медали и тип, подвид в алфавитном порядке
Я делаю это в рубине, но я предполагаю, что язык не имеет значения. Я действительно выяснял решение, но если чувствует, что должен быть намного более изящный способ сделать это.
Вот то, что я сделал:
Создайте виртуальный атрибут со взвешенным общим количеством медали. Таким образом, если бы они имели 2 золота и 1 серебряное, взвесили общее количество, то был бы "3.020100". 1 золото и 1 серебро и 1 бронза были бы "3.010101"
Так как мы хотим отсортировать количество медали как самое высокое первый, список отсортирован DESC. Но затем мы хотим подотсортировать в алфавитном порядке (т.е. ASC) после этого. Таким образом, я создал функцию, которая будет альфа-инвертирование слово (т.е. "Канада" => "xzmzwz")
Преобразуйте взвешенное общее количество в строку, concat обратное имя (т.е. "3010101xzmzwz"), затем убывание вида. Вуаля.
К настоящему времени кто-то выяснил, как выполнить в том же самом приблизительно 2 строки кода. Хотеть просветить меня?
countries.sort_by do |country|
medals = country.gold + country.silver + country.bronze
[-medals, -country.gold, -country.silver, country.name]
end
Я уже довольно долго использую 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 механизм, который поможет сравнить два ваших объекта «Страна»?
Простой метод - использовать sort_by с некоторой строкой произвольного формата, например:
countries.sort_by do |c|
"%010d-%010d-%010d-%s" % [ c.gold, c.silver, c.bronze, c.name ]
end
Это преобразует все страны в сортируемый список ASCII, добавляя количество завоеванных медалей до предположительно безумных 10 мест. Если кто-то выиграет более десяти миллиардов медалей, ваша программа может дать сбой, но это кажется разумным ограничением.