如何将一个整数数组转换为一个整数

3

I have a ruby array that looks like this:

[nil, 3, 4, 2]  

我希望将其转换为整数,如下所示:
342 如果可以,那么我该如何做到这一点?

1
如果允许通过字符串进行往返处理,则这很简单(如Andrey所示)。尝试不使用字符串实现它。这是一个很好的练习。 - Sergio Tulentsev
2
如果你的数组可能包含nil,那么像[nil, nil, nil]这样的数组应该转换成什么?(如果你的答案是0,那么像[3, 2, nil, 1]这样的数组应该转换成321还是3201?) - Tom Lord
你所提出的问题是一个很有价值的观点,@TomLord。不过在我的情况下,这个数组是我编写的函数的输出结果。我编写的这个函数总是会以[nil, 1][nil, 1, 2][nil, 3, 4, 2]的形式返回一个数组。在出现[nil,0,1]的情况下,我希望得到的结果为1,而对于[nil,1,0,4]则应该得到104。我不确定这是否符合您的要求? - Lesego M
你能获取数组:[nil][0]吗?你想将它们同时转换为0吗? - Tom Lord
这里并没有真正的“错误答案”; 我只是想指出,如果数组中有非整数(或者有多位数字),你所做的事情可能有点不可靠。 - Tom Lord
3个回答

12
[nil, 3, 4, 2].join.to_i
#=> 342

1
你不需要压缩。 - Ursus

2
是的。
[nil, 3, 4, 2].inject(0){|x, d| d ? (x * 10) + d : x}
# => 342

1
这可能是那些问题之一,我们有道德责任“教”他们如何钓鱼,而不是给他们鱼。 - Sergio Tulentsev
1
不错,虽然我会使用 ary.compact.inject { |x, d| x * 10 + d } 来处理 nil - Stefan

1
当您无法简单地遵循操作优先级并且Ruby变得像Lisp一样时 -))
a = [nil, 3, 5, 5]
a.each_with_index.inject(0) { |s, e| s+(e[0].to_i)*(10**(a.length-1-e[1])) }
#=> 355

以下是更多类似于Ruby的同义词。感谢@Stefan提供的指导。

a.reverse.each_with_index.inject(0) { |s, (i, e)| s + i.to_i * 10 ** e }
a.reverse_each.with_index.inject(0) { |s, (i, e)| s + i.to_i * 10 ** e }

上面的代码片段只是将每个元素乘以10的幂并将它们相加。

是的,你说得对,让我来修复它。 - marmeladze
1
你可以使用额外的括号分解数组参数,并以相反的顺序迭代元素,以避免调用a.lengtha.reverse_each.with_index.inject(0) { |s, (i, e)| s + i.to_i * 10 ** e } - Stefan
以前没有尝试过 reverse_each -)) 谢谢。 - marmeladze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接