Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby数组,在我的例子中转换为两个数组_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby数组,在我的例子中转换为两个数组

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

我有一个字符串数组,其中包含“firstname.lastname?some.xx”格式的字符串:

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