Ruby: Sorting except one element

时间:2019-04-10 15:27:48

标签: ruby sorting alphabetical

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.

4 个答案:

答案 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”。