按条件在 Ruby 中排序

Sorting in Ruby by conditions

我有这个数组:

arr = [3, 8, 2, 13, 7]

我需要先按元素中 1 的位数对元素进行排序,然后再按小数点排序:

bits | decimal
-----+--------
  10 |       2
  11 |       3
0001 |       8
 111 |       7
1011 |      13

得到结果:

[2, 3, 8, 7, 13]

我有这个代码:

arr = arr.sort { |x, y| x <=> y }
arr = arr.sort { |x, y| x.to_s(2).count(?1) <=> y.to_s(2).count(?1) }
arr # => [2, 8, 3, 13, 7]

我该如何解决?

arr.sort_by { |item| [item.to_s(2).count(?1), item] }
# => [2, 8, 3, 7, 13]

这与声明的期望输出相矛盾,但我相信与问题的描述一致(并且声明的期望输出不正确):2、8 各有 1 位,3 有 2、7 和 13 有每个3位; 2 在 8 之前,7 在 13 之前。

这是可行的,因为数组的默认比较器是按元素比较它们;例如对于 28,比较器看到 [1, 2] <=> [1, 8];由于第一个元素相同,因此将第二个元素作为决胜局进行比较。

我把 "decimal" 理解为 "the numeric value",如 OP 的代码所示;如果按字面理解为"the decimal representation",则

arr.sort_by { |item| [item.to_s(2).count(?1), item.to_s] }
# => [2, 8, 3, 13, 7]