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?
4 Réponses :
["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#<=>.
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
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"]
Bonne idée avec partition
! Aussi arr.sort.partition {| e | e == 'e'}. aplatir
@iGian vaut la peine d'être ajouté à coup sûr
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'.
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 # => []
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 unnil
.