-1

我有一个 ID 数组和一个单独的散列,指示这些 ID 的排序方式。像这样的东西:

大批:

[
  7,
  3,
  2,
]

排序等级:

{
  1 => 50,
  2 => 70,
  3 => 10,
  4 => 80,
  5 => 60,
  6 => 20,
  7 => 0,
}

我想通过使用哈希值优雅地对第一个数组进行反向排序。所以结果应该是这样的:

[
    2,
    3,
    7,
]

我知道有蛮力方法,但有没有更简单、更高效的方法来做到这一点?

4

3 回答 3

2

我不确定性能更高,但这是一种相对简单的方法

arr = [
  {
    :id => 7,
  },
  {
    :id => 3,
  },
  {
    :id => 2,
  }
]

ranks = {
  1 => 50,
  2 => 70,
  3 => 10,
  4 => 80,
  5 => 60,
  6 => 20,
  7 => 0,
}

arr2 = arr.sort_by{|elem| -ranks[elem[:id]]}

arr2 # => [{:id=>2}, {:id=>3}, {:id=>7}]
于 2013-10-03T21:09:12.543 回答
2

假设您已经定义order_hashobject_array您可以使用以下代码进行排序:

object_array.sort{ |a, b| order_hash[b[:id]] <=> order_hash[a[:id]] }

如果需要,您可以使用一些常量来代替order_hash

于 2013-10-03T21:09:42.390 回答
0

使用Enumerable#sort_by

input = [
  7,
  3,
  2,
]

ranks = {
  1 => 50,
  2 => 70,
  3 => 10,
  4 => 80,
  5 => 60,
  6 => 20,
  7 => 0,
}

result = input.sort_by{|x| ranks[x]} #=> [7, 3, 2]
于 2013-11-08T19:40:40.620 回答