2011-08-11 149 views
18

好吧,說我有一個數組像這樣[[z,1],[d,3],[e,2]],我該如何排序這個數組每個組成陣列的元素?這樣我的數組看起來像下面那樣? [[z,1],[e,2],[d,3]]?排序一個二維數組的第二個值

+2

請注意,這實際上是一個數組的數組,而不是一個2維數組。 – Phrogz

+0

[按數字排序對象集合(最高優先),然後按字母排序(按字母順序排列)](http://stackoverflow.com/questions/2232470/sort-a-collection-of-objects-by-number-最高優先字母后的字母) –

回答

33
arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]} 
# => [[:z, 1], [:e, 2], [:d, 3]] 

或者作爲用戶@Phrogz指出,如果內部陣列具有各自正好有兩個要素:

arr.sort_by{|x,y|y} # => [[:z, 1], [:e, 2], [:d, 3]] 
arr.sort_by(&:last) # => [[:z, 1], [:e, 2], [:d, 3]] 
+12

或者更簡單:'arr.sort_by {| s,n | n}'或甚至'arr.sort_by(&:last)'(在Ruby 1.9中)。 – Phrogz

+1

'arr.sort_by(&:last)'也適用於Ruby 1.8.7。 –

+0

@Progrog 由於在ruby 2.4(自2.0甚至在之前)'sort_by'不存在,但只有'sort_by!'和[doc](https://ruby-doc.org/ core-2.4.0/Array.html#method-i-sort_by-21)說: _結果不能保證穩定。當兩個鍵相等時,相應元素的順序是不可預知的。因此,要使用'sort_by!',您必須具有uniq鍵。 So @maerics請編輯您的帖子來說或刪除'sort_by'。 – noraj

0

隨着用戶maerics回答它提供升序sorting.This答案是對我的感謝非常有用的。 對於降序排序我使用 -

arr = [[:z,1], [:d,3], [:e,2]] 
arr.sort {|a,b| a[1] <=> b[1]}.reverse 
#=> [[:d, 3], [:e, 2], [:z, 1]] 
+0

您可以通過簡單地執行'arr.sort {| a,b || b [1] <=> a [1]}'(注意比較運算符操作數的相反順序)。 – maerics

+1

您的代碼中有錯字,正確的代碼是'arr.sort {| a,b | b [1] <=> a [1]}'。你已經插入了一個管道字符太多 – Fred