按条件在 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 之前。
这是可行的,因为数组的默认比较器是按元素比较它们;例如对于 2
和 8
,比较器看到 [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]
我有这个数组:
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 之前。
这是可行的,因为数组的默认比较器是按元素比较它们;例如对于 2
和 8
,比较器看到 [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]