ruby - sort - ordenar lista de objetos por atributo java
Ordenar una colección de objetos por número(el más alto primero) luego por letra(alfabético) (3)
Un método simple es usar sort_by con alguna cadena con formato arbitrario, como:
countries.sort_by do |c|
"%010d-%010d-%010d-%s" % [ c.gold, c.silver, c.bronze, c.name ]
end
Esto convierte a todos los países en una lista ordenable ASCII rellenando el número de medallas ganadas a los 10 lugares supuestamente escandalosos. Si alguien gana más de diez mil millones de medallas, su programa puede funcionar mal, pero parece una restricción razonable.
Estoy construyendo un widget para mostrar los conteos de medallas para los Juegos Olímpicos. Tengo una colección de objetos de "país", donde cada uno tiene un atributo de "nombre" y "oro", "plata", "bronce" para el recuento de medallas.
La lista debe ordenarse: 1. Primero por cantidad total de medallas 2. Si las mismas medallas, clasifique por tipo (oro> plata> bronce, es decir, dos oros> 1 oro + 1 plata) 3. Si las mismas medallas y tipo, sub -orden alfabéticamente
Estoy haciendo esto en ruby, pero supongo que el lenguaje no importa. Descubrí una solución, pero si se siente como que debe haber una forma mucho más elegante de hacerlo.
Esto es lo que hice:
Crea un atributo virtual con el total de la medalla ponderada. Entonces, si tuvieran 2 de oro y 1 de plata, el total ponderado sería "3.020100". 1 de oro y 1 de plata y 1 de bronce sería "3.010101"
Como queremos clasificar el recuento de medallas como el más alto primero, la lista se ordena DESC. Pero luego queremos subdividir alfabéticamente (es decir, ASC) después de eso. Así que creé una función que invertiría alfa una palabra (es decir, "canada" => "xzmzwz")
Convierte el total ponderado en una cadena, concatena el nombre invertido (es decir, "3010101xzmzwz"), luego ordena de forma descendente. Voila.
Por ahora, alguien ha descubierto cómo hacer lo mismo en aproximadamente 2 líneas de código. ¿Me cuidas para iluminarme?
countries.sort_by do |country|
medals = country.gold + country.silver + country.bronze
[-medals, -country.gold, -country.silver, country.name]
end
En Java implementaría comparable en su objeto y luego podría clasificarse fácilmente en ArrayList o Array. ¿Hay algún mecanismo en Ruby para contar cómo comparar dos de tus objetos "Country"?