我正在尝试对数组中的字符串元素进行排序。假设我想按照 [b, e, f, t, g] 的顺序进行排序,但是希望在 ruby 中将 e 保留在第一位。因此结果应该是 [e, b, f, g, t]。我该如何编写 Ruby 代码以按这种方式对数组进行排序。
最初的回答:
arr = ["b", "e", "f", "t", "g"]
arr.sort_by! { |x| x == "e" ? -1 : arr.index(x) }
我正在尝试对数组中的字符串元素进行排序。假设我想按照 [b, e, f, t, g] 的顺序进行排序,但是希望在 ruby 中将 e 保留在第一位。因此结果应该是 [e, b, f, g, t]。我该如何编写 Ruby 代码以按这种方式对数组进行排序。
最初的回答:
arr = ["b", "e", "f", "t", "g"]
arr.sort_by! { |x| x == "e" ? -1 : arr.index(x) }
["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#<=>
的第三段。
s == 'e' ? '' : " #{s}"
或者更好的是"#{ s unless s == 'e' }"
,假设没有nil
元素或空字符串。 - undefinedArray
分成所有的“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"]
partition
这个想法不错!还有arr.sort.partition {|e| e == 'e'}.flatten
。 - undefined再添加一个选项,将其转换为哈希表:
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 #=> []
arr.sort.reject{|x| x=="e"}.unshift('e')
e
,会怎么样? - undefinedarr.sort.unshift(arr.delete('e'))
。仅适用于包含唯一字符的数组,并且'e'
必须存在,否则将返回nil
。 - undefined