可能有一种更高效、更符合Ruby风格的方法来完成这个任务:
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
return a if n <= a.length
return padleft([x] + a, n, x)
end
你有什么建议?
由于我误解了问题,我的答案以前是从右侧填充的,但问题要求从左侧填充。我已经做了相应的更正。这是由于命名约定。 ljust
,rjust
是 String
的内置方法,我将该约定扩展到了 Array
,但在问题术语中,分别对应于 padright
和 padleft
。
破坏性方法
def padleft!(a, n, x)
a.insert(0, *Array.new([0, n-a.length].max, x))
end
def padright!(a, n, x)
a.fill(x, a.length...n)
end
更自然的方式是将其定义在Array
类上:
class Array
def rjust!(n, x); insert(0, *Array.new([0, n-length].max, x)) end
def ljust!(n, x); fill(x, length...n) end
end
非破坏性方法
def padleft(a, n, x)
Array.new([0, n-a.length].max, x)+a
end
def padright(a, n, x)
a.dup.fill(x, a.length...n)
end
或者class Array
def rjust(n, x); Array.new([0, n-length].max, x)+self end
def ljust(n, x); dup.fill(x, length...n) end
end
FWIW:
def rpad(item, padding, num)
Array(item).fill padding, Array(item).size, num
end
# rpad "initialize value(s)", 0, 3
# => ["initialize value(s)", 0, 0, 0]
使用 10
作为填充长度,'x'
作为填充值,可以进行右侧填充:
>> asdf = %w[0 1 2 3 ] #=> ["0", "1", "2", "3"]
>> asdf += (asdf.size < 10) ? ['x'] * (10 - asdf.size) : [] #=> ["0", "1", "2", "3", "x", "x", "x", "x", "x", "x"]
或者
>> asdf = (asdf.size < 10) ? ['x'] * (10 - asdf.size) + asdf : asdf #=> ["x", "x", "x", "x", "x", "x", "0", "1", "2", "3"]
填充到左侧
如果在数组上打补丁十分有意义:
class Array
def pad_right(s, char=nil)
self + [char] * (s - size) if (size < s)
end
def pad_left(s, char=nil)
(size < s) ? [char] * (s - size) + self : self
end
end
%w[1 2 3].pad_right(5, 'x') # => ["1", "2", "3", "x", "x"]
%w[1 2 3].pad_left(5, 'x') # => ["x", "x", "1", "2", "3"]
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
return a if n <= a.length
return [x] * (n - a.length) + a
end
这里有另一个有趣的一行代码可以做到:
(非破坏性)
def padleft(a, n, x)
a.dup.reverse.fill(x, a.length..n-1).reverse
end
(破坏性的)
def padleft(a, n, x)
a.reverse.fill(x, a.length..n-1).reverse
end
# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
(n - a.size).times.inject(a) do |array, i|
array << x
end
end
[1,2,3,4,5,6].in_groups_of(4)
=> [[1, 2, 3, 4], [5, 6, nil, nil]]
n
是所需索引中最大的一个,而不是所需数组的长度。 - Raphael