57277


配列を昇順にソートしたとき，要素とソート前の番号を紐づけて保持したいです．

例えば，以下の用な処理を実現したいです．

[code]

    arr = [5, 8, 1, 3, 4, 7, 9, 6]
    
[/code]

を昇順にソートして，何らかの方法で，「数値:ソート前の要素番号」へ．

[code]

    arr_afterSort = [1:2, 3:3, 4:4, 5:0, 6:7, 7:5, 8:1, 9:6]
    
[/code]

`Hash`を使う方法も考えたのですが，Keyは文字列，valueは数値でしか指定できないので私が実現したいことができません．  
また，`.sort`で昇順にしても要素番号がわからなくなるかと思います．  
あと，`require 'active_support'`，`require
'active_support/core_ext'`を使って配列を`.deep_dup`して，ソートした配列をdupした配列と同じ数字かを検索して要素番号を取得する，も考えたのですがスマートな手法ではなく，強引な感じがします．

どなたかご教授よろしくおねがいします．


CC BY-SA 4.0
2019-08-08T05:13:04.130
57240
2019-08-09T15:29:03.723
2019-08-08T05:26:43.543
30173
30173
question
ruby
配列を昇順にソートしたとき，要素とソート前の番号を紐づけて保持したい

[code]

    arr = [5, 8, 1, 3, 4, 7, 9, 6]
    => [5, 8, 1, 3, 4, 7, 9, 6]
    
    arr.each_with_index.sort_by { |n, _i| n }
    => [[1, 2], [3, 3], [4, 4], [5, 0], [6, 7], [7, 5], [8, 1], [9, 6]]
    
    arr.each_with_index.sort_by { |n, _i| n }.to_h
    => {1=>2, 3=>3, 4=>4, 5=>0, 6=>7, 7=>5, 8=>1, 9=>6}
    
[/code]

でしょうか。


CC BY-SA 4.0
2019-08-08T05:40:32.577
57241
2019-08-08T05:40:32.577
12274
57240
answer


質問に対応する回答はquiquiさんの方が的確ですが、私ならソート時のインデックスの配列だけ作ればいいと思うので、こうします。

[code]

    #!/usr/bin/env ruby
    
    arr = [5, 8, 1, 3, 4, 7, 9, 6]
    
    index = arr.each_with_index.sort_by { |n, _i| n }.map { |_n, i| i }
    
    print 'arr：'
    pp arr
    print 'index：'
    pp index
    puts "arrの最初の値：#{arr[0]}"
    puts "arrのソート後の最初のindex：#{index[0]}"
    puts "arrのソート後の最初の値：#{arr[index[0]]}"
    
[/code]

結果は、

[code]

    arr：[5, 8, 1, 3, 4, 7, 9, 6]
    index：[2, 3, 4, 0, 7, 5, 1, 6]
    arrの最初の値：5
    arrのソート後の最初のindex：2
    arrのソート後の最初の値：1
    
[/code]

となると思います。


CC BY-SA 4.0
2019-08-08T13:49:29.143
57254
2019-08-08T13:49:29.143
7900
57240
answer


これでどうでしょう

[code]

    [5, 8, 1, 3, 4, 7, 9, 6].each_with_index.sort
    # => [[1, 2], [3, 3], [4, 4], [5, 0], [6, 7], [7, 5], [8, 1], [9, 6]]
    
[/code]

Hashが良ければto_hで

[code]

    [5, 8, 1, 3, 4, 7, 9, 6].each_with_index.sort.to_h
    # => {1=>2, 3=>3, 4=>4, 5=>0, 6=>7, 7=>5, 8=>1, 9=>6}
    
[/code]


CC BY-SA 4.0
2019-08-09T15:29:03.723
57277
2019-08-09T15:29:03.723
2599
57240
answer