2009-07-28 21 views
19

における配列の配列をソート:は、私はそうのような配列の配列を持つルビー

irb(main):028:0> device_array 
=> [["name1", "type1", ["A", "N", "N"], ["Attribute", "device_attribute"], 9], ["name2","type2", ["A", "N", "N"], ["Attribute", "device_attribute"], 7]] 

私は第四の要素で全体device_arrayをソートしたいと思います。どちらの方法が働いていない

AllDevicesController.all_devices.sort do | a,b | 
    a[][4] <=> b[][4] 
end 

私は、私も試してみた

AllDevicesController.all_devices.sort do | a,b | 
    for i in 0..(AllDevicesController.all_devices.length - 1) do 
    a[i][4] <=> b[i][4] 
    end 
end 

を試してみました。

私はリファレンスとしてこれを使用していた。 http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

私はこれは本当に簡単ですrubyish何かが欠けていると想像。

答えて

22

<=>nilを使用することはできません。これは、結果の先頭にインデックス4のない要素を持っていないサブアレイを置く

AllDevicesController.all_devices.sort do |a, b| 
    a[4].nil? ? -1 : b[4].nil? ? 1 : a[4] <=> b[4] 
end 

あなたのコードは次のようなものでなければなりません。それ以外の方法で行うには、-11と交換してください。

sortの代わりにsort_byを使用することもできます。これはRuby 1.8.7で導入されたと思います(古いバージョンを使用している場合は動作しない可能性があります)。あなたに合わせてこの定数0を変更したかのようにこれはありません4要素でサブアレイを扱います

​​

:それは次のようになります。

EDIT:

あなたが入力を調整した後、あなたが正しい答えに非常に接近していた今は明らかです。あなたのコードがされている必要があります。

AllDevicesController.all_devices.sort do |a, b| 
    a[4] <=> b[4] 
end 

または単純な(ルビー1.8.7以上を想定):

AllDevicesController.all_devices.sort_by { |e| e[4] } 

どちらの場合も、変数abは、これを元の配列の要素が含まれていますどのような位置にある要素にも直接アクセスできる理由があります(また、a[][4]などのRubyの構文が間違っている必要はありません)。

+0

私はもちろん、device_arrayの0番目の要素の4番目の要素を除いています。何もないオブジェクトはありません。 –

+0

その場合、唯一の問題は 'a [4]'の代わりに 'a [] [4]'を使用していることです。 'a [] [4]'は有効なRuby構文ではありません。 –

2

第四の要素は、あなたがこのようにそれを行うだろう意味し、インデックス3で実際にある:あなたが本当に最初の要素のために存在していないインデックス4(の要素をソートしたい場合は

all_devices.sort do |a, b| 
    a[3] <=> b[3] 
end 

all_devices)の、あなたは最初NilClassとの比較を追加する必要があります。

class NilClass 
    def <=> (other) 
    1 
    end 
end 

all_devices.sort do |a, b| 
    a[4] <=> b[4] 
end 

これが最後にnilをソートします。<=>の戻り値を-1に変更して前面に並べ替えます。

+0

この方法は、キャッチするバグを少し難しくすることになります。それはコード内のどこでも 'nil'との比較を可能にするからです。それは賢明に使われるべきです。 –

2

は、あなたの配列は、そのデータに最適だろうよろしいです..私は質問が回答されている知っている、と私は今、それに対処するつもりはない、しかし?私はこれらのデータ要素について話しています:["name1"、 "type1"、 "A"、 "N"、 "N"]、["Attribute"、 "device_attribute"]、

Structなどがこれに対して適切かつ管理しやすくなり、Structsの配列を持つことができます。ちょうどアイデア。

関連する問題