Ruby:排序除了一个元素

问题描述 投票:1回答:4

我试图在数组中排序字符串元素。假设我想对它进行排序[b,e,f,t,g],但是想要在红宝石中保持e。所以结果应该是[e,b,f,g,t]。我怎样才能在ruby中编写一个代码排序的代码。

ruby sorting alphabetical
4个回答
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
投票

只需添加一个选项,转换为哈希:

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]}


For the method to work even when :e is not present:
ary.sort.group_by(&:itself).then { |h| h.delete(:e).to_a + h.values.flatten }

nil.to_a #=> []


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"]    

0
投票

你可以试试这个:

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

如果数组中有“e”以上,则忽略所有“e”。

© www.soinside.com 2019 - 2024. All rights reserved.