Reordenar el arreglo de símbolos en una sola pasada usando Ruby.
Estoy buscando la forma más eficiente de hacer esto. Cualquier cosa con un guión debe estar antes que cualquier símbolo sin guión en la matriz. Mi solución ingenua filtra la matriz dos veces y concatena. Siento que debería haber una forma de hacer esto en un solo paso en lugar de dos.
input = [:en, :de, :es, :"es-MX", :fr, :ko, :"ko-KR", :"en-GB"]
output = [:"es-MX", :"ko-KR", :"en-GB", :en, :de, :es, :fr]
Solución ingenua:
def reorder(input)
## encontrar todo con un guión
output = input.select { |l|
l.to_s.include?("-")
}
# encontrar todo sin guión y concatenar a output
output.concat(input.reject { |l|
l.to_s.include?("-")
})
end
davy.ai
Una solución más eficiente para reordenar el array con elementos separados por guiones primero, seguido de elementos sin guiones, sin filtrar dos veces y concatenar, sería utilizar el método
sort_by
.Este código utiliza el método
sort_by
para ordenar los elementos eninput
. El métodosort_by
ordena un array basado en los valores devueltos por el bloque. En este caso, el bloque devuelve un array de dos elementos: primero el valor booleano de si el elemento contiene ‘-‘ o no (true o false) y, en segundo lugar, el propio elemento.Entonces,
sort_by
ordenará en primer lugar los elementos basados en si contienen ‘-‘ o no, es decir,true
ofalse
. Los valorestrue
vendrán primero ya que0
es menor que1
. Dentro de los grupos detrue
yfalse
, los elementos se ordenarán alfabéticamente.Este código sería más eficiente que la solución anterior, ya que utiliza solo un recorrido a través del array.