2011-03-20 28 views
0

我想映射数组的元素,使得数组的所有元素 都是浮点数,除了第一个元素是 是一个字符串。基于位置映射数组的不同元素

任何人都知道我该怎么做?

试过,但不起作用:

arr = arr.map { |e| e.to_i if e != arr.first } 
+2

为什么不编辑你的问题,并提供一些样本数据,以及所需输出的例子呢? – 2011-03-20 03:01:41

回答

2

另一种解决方案是

[array.first] + array.drop(1).map &:to_f 

这清楚地表明,要在第一元件从其余部分分离,并且想要的元素的其余部分是Float类型。其他选项包括

array.map { |element, index| index == 0 ? element : element.to_f } 
array.map { |element| element == array.first ? element : element.to_f } 
+0

我认为你的意思是:[array.first] + ....这确实是最好的解决方案,不检查循环内部。 – tokland 2011-03-20 09:25:46

1

你可以用很短的三元表达式的位置:

a.map { |e| (e == a.first) ? e : e.to_f } 
1

另一种选择(如果你不希望使用三元经营者)被要做到以下几点:

arr = arr.map { |e| (e == arr.first) && e || e.to_f} 

这个替代方案是讨论here。此方法的一个限制是数组中的第一个元素不能为零(或者其他值可以在布尔评估中评估为false),因为如果是这样,它将计算到||表达式并返回e.to_f而不仅仅是即

1

Ruby 1.9 only?

arr = arr.map.with_index { |e, i| i.zero? ? e.to_s : e.to_f } 
1

您可以询问对象本身是否是数字。

"column heading".respond_to?(:to_int) # => false 
3.1415926.respond_to?(:to_int) # => true 

new_arr = arr.map do |string_or_float| 
    if string_or_float.respond_to?(:to_int) 
    string_or_float.to_int # Change from a float into an integer 
    else 
    string_or_float # Leave the string as-is 
    end 
end 

respond_to?(:to_int)的意思是 “我能叫to_int你吗?”

to_int是一种只能轻松转换为整数的对象应具有的方法。不像to_i,这是“我不是很像一个整数,但你可以尝试将我转换成一个整数”,to_int的意思是“我非常像一个整数 - 将我完全置信地转换成一个整数!”

+0

啊,这是整洁:) – Flethuseo 2011-03-21 19:19:53