2011-08-11 114 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