如何在rails中交替合并2个字符串?

时间:2017-06-05 13:46:47

标签: ruby-on-rails string

我有2个字符串:

a = "qwer"

b = "asd"

Result = "qawsedr"

同样是b的长度大于a。显示替代角色。

最好的方法是什么?我应该使用循环吗?

2 个答案:

答案 0 :(得分:2)

您可以从ab字符串中获取字符,以便将它们作为数组使用,然后"合并"他们使用zip,然后使用join

对于长度不同的字符串,必须反转数组值,所以:

def merge_alternately(a, b)
  a = a.chars
  b = b.chars
  if a.length >= b.length
    a.zip(b)
  else
    array = b.zip(a)
    array.map{|e| e != array[-1] ? e.reverse  : e}
  end
end

p merge_alternately('abc', 'def').join
# => "adbecf"
p merge_alternately('ab', 'zsd').join
# => "azbsd"
p merge_alternately('qwer', 'asd').join
# => "qawsedr"

答案 1 :(得分:0)

塞巴斯蒂安的回答完成了工作,但这是不必要的复杂。这是另一种选择:

def merge_alternately(a, b)
  len = [a.size, b.size].max
  Array.new(len) {|n| [ a[n], b[n] ] }.join
end
merge_alternately("ab", "zsd")
# => "azbsd"

第一行获取较长字符串的大小。第二行使用Array构造函数的块形式;它产生从0到len-1的索引到块,产生类似[["a", "z"], ["b", "s"], [nil, "d"]]的数组。 join将其转换为字符串,方便地在每个项目上调用to_s,将nil变为""

这是另一个基本相同的版本,但跳过中间数组:

def merge_alternately(a, b)
  len = [a.size, b.size].max
  len.times.reduce("") {|s, i| s + a[i].to_s + b[i].to_s }
end

len.times会产生一个枚举器,用于生成从0len-1的索引。 reduce以空字符串s开头,并在每次迭代中附加ab(或"" - nil.to_s的下一个字符 - 如果一个字符串用完字符)。

您可以在repl.it上查看:https://repl.it/I6c8/1

只是为了好玩,这里有几个解决方案。这个很像Sebastián的解决方案,但是如果它比第二个短,则填充第一个字符数组{/ 1}}:

nil

如果没有一点def merge_alternately(a, b) a, b = a.chars, b.chars a[b.size - 1] = nil if a.size < b.size a.zip(b).join end ,它就不是Ruby的答案:

gsub

请参阅repl.it上的这两项:https://repl.it/I6c8/2