我试图在数组中排序字符串元素。假设我想对它进行排序[b,e,f,t,g],但是想要在红宝石中保持e。所以结果应该是[e,b,f,g,t]。我怎样才能在ruby中编写一个代码排序的代码。
["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#<=>
文档的第三段。
只需添加一个选项,转换为哈希:
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
is not present:
ary.sort.group_by(&:itself).then { |h| h.delete(:e).to_a + h.values.flatten }
自nil.to_a #=> []
你可以把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"]
你可以试试这个:
arr.sort.reject{|x| x=="e"}.unshift('e')
如果数组中有“e”以上,则忽略所有“e”。