Necesito ordenar mi arreglo de acuerdo a un elemento del mismo, el elemento de referencia puede variar. Por ejemplo, me gustaría que el 3 se convirtiera en el primer elemento del arreglo y que el 1, 2 se pusieran al final.
El elemento puede variar. Si empiezo desde 5, el comportamiento debe ser el mismo: los elementos que preceden se colocan al final, por lo que tendré:
Si entiendo correctamente, desea rotar la matriz.
array # [1, 2, 3, 4, 5, 6] array.rotate(2) # or array.rotate(array.index(3)) # [3, 4, 5, 6, 1, 2]Definitivamente use #rotate para esto en el uso real, pero como alternativa, podría hacer algo como #shift y #push hasta que el elemento deseado esté al comienzo de la matriz.
def rotate(arr, elem) arr2 = arr.clone arr2.push(arr2.shift) until arr2.first == elem arr2 end irb(main):026:0> arr = [1, 2, 3, 4, 5, 6] => [1, 2, 3, 4, 5, 6] irb(main):027:0> rotate(arr, 3) => [3, 4, 5, 6, 1, 2] irb(main):028:0> arr => [1, 2, 3, 4, 5, 6] Claramente, si elem no está en arr , esto se ejecutará para siempre. Podría implementar algún tipo de verificación para asegurarse de que esto no suceda, pero esa es solo una de las razones por las que en realidad no debería hacer esto como algo más que un ejercicio de aprendizaje.
Un enfoque sería encontrar el índice de elem en arr y cambiar/empujar eso muchas veces. El &. operador puede ser útil en esa situación para hacer frente a la posibilidad de no encontrar elem en arr .