按条件

时间:2018-02-23 19:05:52

标签: ruby sorting decimal bits

我有这个数组:

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]

我该如何解决?

1 个答案:

答案 0 :(得分:3)

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];因为第一个元素是相同的,所以将第二个元素作为决胜局进行比较。

我拿了&#34;十进制&#34;表示&#34;数值&#34;,如OP的代码所示;如果要按字面意思理解为&#34;十进制表示&#34;,那么

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