Ruby on rails Ruby数组,在我的例子中转换为两个数组
我有一个字符串数组,其中包含“firstname.lastname?some.xx”格式的字符串:Ruby on rails Ruby数组,在我的例子中转换为两个数组,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个字符串数组,其中包含“firstname.lastname?some.xx”格式的字符串: customers = ["aaa.bbb?q21.dd", "ccc.ddd?ew3.yt", "www.uuu?nbg.xcv", ...] 现在,我想使用此数组生成两个数组,其中: 第一个数组的元素只有“?”之前的字符串,并将“”替换为空格 第二个数组的元素是“?”后面的字符串,包括“?” 也就是说,我想从客户阵列中生产以下两个阵列: 1st_arr = ["aaa bbb", "cc
customers = ["aaa.bbb?q21.dd", "ccc.ddd?ew3.yt", "www.uuu?nbg.xcv", ...]
现在,我想使用此数组生成两个数组,其中:
- 第一个数组的元素只有“?”之前的字符串,并将“”替换为空格李>
- 第二个数组的元素是“?”后面的字符串,包括“?”
客户
阵列中生产以下两个阵列:
1st_arr = ["aaa bbb", "ccc ddd", "www uuu", ...]
2nd_arr = ["?q21.dd", "?ew3.yt", "?nbg.xcv", ...]
如果我使用客户
数组作为方法的参数,最有效的方法是什么
def produce_two_arr customers
#What is the most efficient way to produce the two arrays
#What I did:
1st_arr = Array.new
2nd_arr = Array.new
customers.each do |el|
1st_Str, 2nd_Str=el.split('?')
1st_arr << 1st_str.gsub(/\./, " ")
2nd_arr << "?"+2nd_str
end
p 1st_arr
p 2nd_arr
end
def生产两个arr客户
#生产这两个阵列最有效的方法是什么
#我所做的:
1st_arr=Array.new
第二个阵列=阵列。新
客户。每个人都有|
第一街,第二街=立面分割(“?”)
1st_arrArray#collect适合这种类型的东西:
arr1 = customers.collect{ |c| c.split("?").first.sub( ".", "" ) }
arr2 = customers.collect{ |c| "?" + c.split("?").last }
但是,您必须执行两次初始c.split(“?”)。因此,从代码量的角度来看,它是有效的,但CPU占用更大。Array#collect适合这种类型:
arr1 = customers.collect{ |c| c.split("?").first.sub( ".", "" ) }
arr2 = customers.collect{ |c| "?" + c.split("?").last }
但是,您必须执行两次初始c.split(“?”)。因此,从大量代码的角度来看,它是有效的,但CPU占用更大。无论何时,只要您从另一个阵列构建阵列,reduce
(也称为inject
)都会有很大帮助:
但有时,您只需要一个好的ol'映射(在本例中,任何一个都可以工作,因为您正在构建一个大小相同的数组):
这是非常有效的,因为您只对客户进行一次迭代,并且通过+
方法不创建大量无关的字符串和数组,从而有效地利用了内存。无论何时从另一个数组构建数组,reduce
(也称inject
)都是一个很大的帮助:
但有时,您只需要一个好的ol'映射(在本例中,任何一个都可以工作,因为您正在构建一个大小相同的数组):
这是非常有效的,因为您只对客户进行了一次迭代,并且通过+
方法不创建大量无关的字符串和数组,从而有效地利用了内存。函数方法:当您在循环中生成结果,但希望将结果拆分为不同的数组时,方便:
ary1, ary2 = customers.map do |customer|
a, b = customer.split("?", 2)
[a.gsub(".", " "), "?" + b]
end.transpose
功能性方法:当您在循环中生成结果,但希望将结果拆分到不同的数组中时,使用起来非常方便:
ary1, ary2 = customers.map do |customer|
a, b = customer.split("?", 2)
[a.gsub(".", " "), "?" + b]
end.transpose
基于@Tokland的代码,但它避免了额外的变量(通过使用'sub'而不是'gsub')和重新附加'?'(通过使用非捕获正则表达式)
基于@Tokland的代码,但它避免了额外的变量(通过使用'sub'而不是'gsub')和重新附加'?'(通过使用非捕获正则表达式)。这看起来很简单,你到底在哪里卡住了?显示一些代码。我同意;除了你前面的问题,我建议你先努力一下。你知道如何创建数组,你知道一些迭代的方法,你知道如何进行替换。字符串上有一个方法。我正要发布我的答案,但我同意。查看数组(提示:map)和字符串文档。看起来您编辑了这个问题。你想要什么样的效率:最简单的代码还是最快的执行时间?是的,我已经添加了我的代码。我正在寻找最简单的代码和执行速度最快的代码。只是想向更有经验的人学习这似乎很琐碎,你到底被困在哪里?显示一些代码。我同意;除了你前面的问题,我建议你先努力一下。你知道如何创建数组,你知道一些迭代的方法,你知道如何进行替换。字符串上有一个方法。我正要发布我的答案,但我同意。查看数组(提示:map)和字符串文档。看起来您编辑了这个问题。你想要什么样的效率:最简单的代码还是最快的执行时间?是的,我已经添加了我的代码。我正在寻找最简单的代码和执行速度最快的代码。只是想向更有经验的人学习是的,我想这两种选择都可以。地图可能更清晰。我想我会更新的。不,不,你现在正在做一个地图注射弗兰肯斯坦:-)看我的答案,他们现在是等价的。请注意,您总是可以使用inject实现map,但这并不是这样做的理由:-)不正确;我想你可能抓到了一个过于急切的救球。哦,对不起。事实上,我看到了一个.map do |结果,客户|。是的,我想这两种选择都可以。地图可能更清晰。我想我会更新的。不,不,你现在正在做一个地图注射弗兰肯斯坦:-)看我的答案,他们现在是等价的。请注意,您总是可以使用inject实现map,但这并不是这样做的理由:-)不正确;我想你可能抓到了一个过于急切的救球。哦,对不起。事实上,我看到了一个.map do |结果,客户|。
array1, array2 = customers.map{|el| el.sub('.', ' ').split /(?:\?)/}.transpose