2017-07-13 29 views
0

ルーピングこの特定の並べ替え/並べ替えの質問については、Rubyで助けを得ることができます。RubyでTSortを使用して配列の並べ替えと並べ替え

そうように私は、配列の配列を持っている

:各アレイ内の

[['b', 'f'], 
['f', 'h'], 
['a', 'e'], 
['b', 'c'], 
['b', 'd'], 
['e', 'g'], 
['c', 'f'], 
['d', 'f'], 
['f', 'g'], 
['g', 'h']] 

2番目の要素は最初の後に発生しなければならないので、私はその配列にそれらをソートしますプログラムを書きたいです以下のようになります。私が使用しようとしている

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 

RubyのTSortライブラリに組み込まれており、私もthis stack overflow postから働いています。

だから私はこれをやっている:

class Hash 
    include TSort 
    alias tsort_each_node each_key 
    def tsort_each_child(node, &block) 
    fetch(node).each(&block) 
    end 
end 

def flex_sort(arr) 
    stuff = arr.map do |head, *tail| 
    {head => tail} 
    end 
    stuff.reduce(&:merge).tsort.reverse 
end 

sorted = flex_sort(flex) 

は、私はこれについていくつか質問があります。まず、私は正しい道を歩いていますか?第2に、このコードを実行すると、最初の配列'h'の配列が配列の最初の配列に含まれていないことがわかります。したがって、それらをハッシュに変換して.tsortを実行しようとすると、key 'h' does not exist、私はそれが壊れないように配列の配列に['h']を入れるように強制します。これを回避する方法はありますか?

+0

あなたの質問は分かりません。あなたの例が要素をアルファベット順にソートしなかった場合は、より明確になります。あなたは '' [[a '、' b ']、[' b '、' c ']、[' c '、' a ']] 'はないと仮定していますか? –

答えて

1

fetchは、存在しない場合はデフォルト値である第2パラメータをとります。

fetch(node, []).each(&block) 

第二の問題は、あなたがお互いにあなたの配列を&:mergeとき、あなたが以前の値を上書きしています。現在のマージ結果は

{"b"=>["d"], "f"=>["g"], "a"=>["e"], "e"=>["g"], "c"=>["f"], "d"=>["f"], "g"=>["h"]} 

であり、キーごとに1つの値しかありません。あなたが実行している今

{"b"=>["f", "c", "d"], "f"=>["h", "g"], "a"=>["e"], "e"=>["g"], "c"=>["f"], "d"=>["f"], "g" =>["h"]} 

よう

def flex_sort(arr) 
    stuff = Hash.new { |hash, key| hash[key] = [] } 
    arr.each do |head, tail| 
    stuff[head] << tail 
    end 

    stuff.tsort.reverse 
end 

にあなたのハッシュに見えることを変更する場合は、あなたのtsortあなたが希望しているものに極めて近い

["a", "e", "b", "d", "c", "f", "g", "h"] 

で終わります。この種のことに慣れていない場合、複数の可能性があるときに他のキーの前にいくつかのキーを選択するように強制する方法があるかどうかを知る必要があります。しかし、これはあなたをもっと近くにします。

+0

ああそうです。これは私のところの方法のほとんどを取得します。ありがとう! –

関連する問題