I am trying to sort string elements in array. Let's say I want to sort it [b, e, f, t, g], but want to keep e in first in ruby. So the result should be [e, b, f, g, t]. How can I write a code in ruby that sort the array that way.
答案 0 :(得分:3)
["b", "e", "f", "t", "g"] .sort_by { |s| [s == 'e' ? 0 : 1, s] }
#=> ["e", "b", "f", "g", "t"]
此处Enumerable#sort_by使用Array#<=>比较该块计算出的每一对元素,例如[0, "e"]
和[1, "b"]
。有关Array#<=>
,请参见文档的第三段。
答案 1 :(得分:1)
您可以将Array
分为所有的“ e”和所有的非“ e”,然后像这样将它们还原在一起
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"]
向@iGian的
arr.sort.partition {|e| e == 'e'}.flatten
#=> ["e", "e", "b", "f", "g", "t"]
答案 2 :(得分:1)
只需再添加一个选项,即可转换为哈希:
ary = [:b, :e, :f, :t, :g, :e]
ary.sort.group_by(&:itself).then { |h| h.delete(:e) + h.values.flatten }
它返回将所有:e
放在前面的数组。 :e
必须存在。
#=> [:e, :e, :b, :f, :g, :t]
第一部分返回排序后的分组哈希:
ary.sort.group_by(&:itself) #=> {:b=>[:b], :e=>[:e, :e], :f=>[:f], :g=>[:g], :t=>[:t]}
:e
不存在时起作用:
ary.sort.group_by(&:itself).then { |h| h.delete(:e).to_a + h.values.flatten }
自nil.to_a #=> []
答案 3 :(得分:0)
您可以尝试以下方法:
arr.sort.reject{|x| x=="e"}.unshift('e')
如果数组中的字符数大于“ e”,则它将忽略所有的“ e”。