Ruby 数组中的字母顺序,顶部有多个默认值

Ruby 数组中的字母顺序,顶部有多个默认值,ruby,arrays,Ruby,Arrays,我有一个字符串数组,我希望它的字母顺序,但与一些默认的顶部。例如: ["a", "b", "default1", "d", "default2", "c", "e"] 我希望结果是: ["default1", "default2", "a", "b", "c", "d", "e"] 有人知道我怎样才能轻松完成这件事吗 更新 默认值也包含在数组中,并且数组按字母顺序排列。类似于此的功能: array = ["a", "b", "default1", "d", "default2", "c",

我有一个字符串数组,我希望它的字母顺序,但与一些默认的顶部。例如:

["a", "b", "default1", "d", "default2", "c", "e"]
我希望结果是:

["default1", "default2", "a", "b", "c", "d", "e"]
有人知道我怎样才能轻松完成这件事吗

更新


默认值也包含在数组中,并且数组按字母顺序排列。

类似于此的功能:

array = ["a", "b", "default1", "d", "default2", "c", "e"]
defaults = ["default1", "default2"] #Add more if needed
sorted_array = array.sort{|a, b| defaults.include?(a) ? -1 : defaults.include?(b) ? 1 : a <=> b }
puts sorted_array # => ["default1", "default2", "a", "b" "c", "d", "e"]
array=[“a”、“b”、“default1”、“d”、“default2”、“c”、“e”]
默认值=[“default1”、“default2”]#如果需要,添加更多
sorted|u array=array.sort{a,b|defaults.include?(a)?-1:defaults.include?(b)?1:ab}
将已排序的_数组#=>[“default1”、“default2”、“a”、“b”、“c”、“d”、“e”]
可枚举项包括:

如果您获取的数据没有按您想要的最终顺序排序,您可以在对其进行分区之前对其进行预排序:

data = ["c", "b", "default2", "a", "default1", "e", "d"]
data.sort.partition{ |d| d['default'] }.flatten
=> ["default1", "default2", "a", "b", "c", "d", "e"]

如果您需要一种更智能、更全面的排序算法来处理各种“默认”条目,您可能可以使用
排序
排序依据
,使用lambda或proc来区分默认条目和常规条目之间的差异,并返回所需的
-1
0
1
值。

利用数组定义的词典顺序,我写:

defaults = Hash[["default1", "default2"].to_enum.with_index.to_a]
xs = ["a", "b", "default1", "d", "default2", "c", "e"]
xs.sort_by { |x| [defaults[x] || defaults.size, x] }
#=> ["default1", "default2", "a", "b", "c", "d", "e"]

默认值是您显式添加的,还是包含在数组中,并且您希望将其强制到顶部?输入数组是预先排序的吗?如果没有,默认值是按字母顺序排列的吗?答案不错,你可以测试几乎任何东西来构建分区,很容易阅读!使用
partition
是一个很好的解决方案,唯一的问题是——在第二种情况下——所需的默认值不是按字母顺序排列的(问题没有指定它)。一个很小的挑剔:我会写
flatte(1)
来明确我想要一个一级的扁平化来分解分区的结构(不幸的是
flatte
在默认情况下是递归的)。我同意扁平化不应该是递归的。因为,对于这个问题,
分区
的结果是有限深度的数组,
无参数展平
是安全的。非常感谢!这是一个很棒的解决方案,我不知道分区存在。非常感谢!!我认为瘦男人的解决方案更干净一些,但这也是一个很好的解决方案。我只能接受一个:(我要更详细地说明我的问题。)
defaults = Hash[["default1", "default2"].to_enum.with_index.to_a]
xs = ["a", "b", "default1", "d", "default2", "c", "e"]
xs.sort_by { |x| [defaults[x] || defaults.size, x] }
#=> ["default1", "default2", "a", "b", "c", "d", "e"]