1
votes

Ruby: tri sauf un élément

J'essaie de trier les éléments de chaîne dans un tableau. Disons que je veux le trier [b, e, f, t, g], mais que je veux garder e en premier dans ruby. Le résultat devrait donc être [e, b, f, g, t]. Comment puis-je écrire un code en ruby ​​qui trie le tableau de cette façon?


3 commentaires

Et s'il y a plus d'un e ?


restons assis, il n'y a qu'un e; c'est juste un exemple; J'utiliserais «par défaut» dans mon cas


arr.sort.unshift (arr.delete ('e')) . Ne fonctionne que pour un tableau de caractères uniques et le 'e' doit exister sinon vous obtiendrez un nil .


4 Réponses :


4
votes
["b", "e", "f", "t", "g"] .sort_by { |s| [s == 'e' ? 0 : 1, s] }
  #=> ["e", "b", "f", "g", "t"] 
Here Enumerable#sort_by uses Array#<=> to compare each pair of elements computed by the block, such as [0, "e"] and [1, "b"]. See the third paragraph of the doc for Array#<=>. 

1 commentaires

Vous pouvez également utiliser s == 'e'? '': "# {S}" ou mieux encore "# {s sauf si s == 'e'}" en supposant qu'il n'y a pas d'éléments nil ou de chaînes vides



2
votes

Vous pouvez partitionner le Array en tous les "e" et tous les non "e", puis les réduire ensemble comme ceci

  arr.sort.partition {|e| e == 'e'}.flatten
  #=> ["e", "e", "b", "f", "g", "t"]    

Crédit supplémentaire à @iGian pour

  arr = ["b", "e", "f", "t", "e","g"]
  arr.partition {|e| e == 'e'}.reduce {|e,not_e| e.concat(not_e.sort)}
  #=> ["e", "e", "b", "f", "g", "t"]    


2 commentaires

Bonne idée avec partition ! Aussi arr.sort.partition {| e | e == 'e'}. aplatir


@iGian vaut la peine d'être ajouté à coup sûr



0
votes

Vous pouvez essayer ceci:

 arr.sort.reject{|x| x=="e"}.unshift('e')

Si vous avez plus de "e" dans le tableau, il ignorera tous les 'e'.


0 commentaires

1
votes

Juste pour ajouter une option de plus, la conversion en un Hash:

ary.sort.group_by(&:itself).then { |h| h.delete(:e).to_a + h.values.flatten }

Il retourne le tableau en gardant tous les : e devant. : e doit exister.

ary.sort.group_by(&:itself) #=> {:b=>[:b], :e=>[:e, :e], :f=>[:f], :g=>[:g], :t=>[:t]}

La première partie renvoie le hachage de regroupement trié:

#=> [:e, :e, :b, :f, :g, :t]

Pour que la méthode fonctionne même lorsque : e n'est pas présent :

ary = [:b, :e, :f, :t, :g, :e]
ary.sort.group_by(&:itself).then { |h| h.delete(:e) + h.values.flatten }

Depuis nil.to_a # => []


0 commentaires