我有这个数组:
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]
我该如何解决?
答案 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。
这是有效的,因为数组的默认比较器是按元素比较它们;例如对于2
和8
,比较器看到[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]