文字列を含む配列があり、アルファベット順にしたいのですが、いくつかのデフォルトが上にあります。例えば:
["a", "b", "default1", "d", "default2", "c", "e"]
結果は次のようになります。
["default1", "default2", "a", "b", "c", "d", "e"]
誰かが私がこれを簡単に達成する方法を知っていますか?
アップデート
デフォルトも配列に含まれており、配列はアルファベット順になっています。
列挙可能な内容partition
:
data = ["a", "b", "default1", "d", "default2", "c", "e"]
data.partition{ |d| d['default'] }.flatten
=> ["default1", "default2", "a", "b", "d", "c", "e"]
取得したデータが最終的な順序で並べ替えられていない場合は、パーティション分割する前に事前に並べ替えることができます。
data = ["c", "b", "default2", "a", "default1", "e", "d"]
data.sort.partition{ |d| d['default'] }.flatten
=> ["default1", "default2", "a", "b", "c", "d", "e"]
さまざまな「デフォルト」エントリを処理するために、よりインテリジェントで包括的なソート アルゴリズムが必要な場合は、デフォルトと通常のエントリの違いを識別し、必要な,および値を返すことができるラムダまたはプロシージャでsort
orを使用できます。sort_by
-1
0
1
このような作品:
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"]
配列によって定義された辞書式順序を利用して、次のように記述します。
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"]