es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for 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.

    def reorder(input)
       input.sort_by { |l| [l.to_s.include?('-') ? 0 : 1, l] }
    end
    

    Este código utiliza el método sort_by para ordenar los elementos en input. El método sort_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 o false. Los valores true vendrán primero ya que 0 es menor que 1. Dentro de los grupos de true y false, 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.

Comments are closed.