2016-06-23 12 views
-1

の配列の現在のソート順でインデックスを検索します。ルビー

array A = ["d","c","b","a"] 

は私が私が

UPDATE質問にこのルビーの解決策を見つけようとしている

[3,2,1,0] 

ソート順序に基づいて更新されたインデックスを返す配列が必要

array A = ["d","b","c","a"] #not a pure reverse 

返さインデックス配列は、あなたが非マップの再注文したバージョンにその順序を使用し、その後、元の順序を保持するマッピングテーブルを作成する必要が

[3,1,2,0] 
+0

へようこそSOに変化をもたらすdupか何かを使用して再作成されなかったとして

jumbled_array.map {|i| original_array.map(&:object_id).index(i.object_id)} 

このソリューションは限り動作します。 「[ask]」をお読みください。問題を解決するためのあなたの努力を見たいと思います。コードを書きましたか?もしそうなら、 "[mcve]"を読んでください。私たちはあなたのためのコードを書いていませんが、コードを修正するのに役立ちます。 –

答えて

5

次のようになります。

orig = %w[ a b c d ] 
orig_order = orig.each_with_index.to_h 

revised = %w[ d c b a ] 

revised.map { |e| orig_order[e] } 
# => [3, 2, 1, 0] 

あなたの要素がユニークである限り、これは任意のシフトを順番に追跡することができます。

0

mapindexの方法を使用できます。ここで

arr = ["a","b","c","d"] 

sort_arr = ["d","c","b","a"] 

sort_arr.map{|s| arr.index(s)} 
# => [3, 2, 1, 0] 
+0

良いシンプルなソリューションですが、配列が大きくなるとパフォーマンスが低下する可能性があります。配列に複製された要素があり、目的の動作は何か? –

+0

@AndrewSchwartzアレイが大きくなると、パフォーマンス上の問題が発生する可能性があります。この場合、いくつかの 'ハッシュ '方法を使うことにします。重複した要素は問題になりますが、回答はその場合の動作を指定しません。 –

0

これを行うための一つの方法です:

original_array = ["a","b","c","d"] 
jumbled_array = original_array.shuffle 

jumbled_array.map {|i| original_array.index(i)} 
#=> [1, 3, 0, 2] 

注:このサンプルで

  1. 我々が実証するshuffleを使用していると、出力はすべての実行のために変更されます溶液。
  2. 解決策は、配列に重複する値がない限り有効です。

あなたが重複する値を持つ配列を扱うためのソリューションを希望した場合は、その後、1つの可能性は、インデックスを考え出すながら、アレイメンバーのobject_idを見ることです。 jumbled_arrayoriginal_arrayから要素を含んでおり、何の要素がobject_id