在Ruby中使用数组实现案例检查的最佳实践是什么?
def partition(a)
a_values = [1,4,5]
b_values = [2,3,7]
a.group_by do |n|
case n
when *a_values then :a
when *b_values then :b
else :c
end
end
end
partition((1..10))
#=> {:a=>[1, 4, 5], :b=>[2, 3, 7], :c=>[6, 8, 9, 10]}该示例使用splat操作符*来检查给定的数组。我对演出的影响表示怀疑。你有什么建议?
发布于 2017-07-05 15:24:42
我会考虑使用没有变量的case语句。类似于:
case
when a_values.include(n) then :a
when b_values.include(n) then :b
else :c
end如果只有两个选项,则可以使用if进行同样的操作。
如果有很多数组,我会这样做:
VALUES = {
a: [1,4,5],
b: [2,3,7],
...
}
result,_ = VALUES.find( ->{:c} ){ |key,array| array.include(n) }或者可能是倒置:
# If the values are contiguous:
VALUES = [nil, :a, :b, :a, :b, ... ]
# If the values are *not* contiguous:
VALUES = { 1 => :a, 2 => :b, 3 => :a, ... }
result = VALUES[n] || :c如果您关心性能,我建议将性能与使用if的更直接的实现进行比较。与每次调用方法时定义数组相比,常数还可能执行得更好。
发布于 2017-07-07 14:54:00
总的来说,我没有看到任何错误的风格。除非您有非常大的数组,否则我不会太关心性能--您希望值“桶”或输入数组都是巨大的吗?如果是这样的话,你有理由担心,但要小心不要过早地优化。
我建议更改方法的名称。可枚举中已经有一个partition,它的工作方式有点像一个group_by,只不过它将数组划分成两个部分。使用这个方法的名称,它可以做一些不同的事情,这可能有点令人困惑。
因此,这使用了的想法,并将其具体化:
def bucketize(arr)
a = [1,4,5].map{|n| [n,:a]}.to_h
b = [2,3,7].map{|n| [n,:b]}.to_h
values = a.merge(b)
arr.group_by { |n| values[n] || :c }
end它预先计算基于哈希的查找表。我怀疑对于小型数组来说,这样的速度会更慢,对于大型数组,这样的速度会更快。
https://codereview.stackexchange.com/questions/167363
复制相似问题