首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中将多个相同的行转换为一行

在Ruby中将多个相同的行转换为一行
EN

Stack Overflow用户
提问于 2012-07-03 16:32:09
回答 4查看 60关注 0票数 0

在Ruby 1.9.3中,我有一个变量包含如下所示的字符串

代码语言:javascript
运行
复制
#HELLO
#HELLO
#HELLO
#HELLO
#WORLD
#WORLD
#WORLD
#WORLD
#FOO
#BAR
#WORLD

我想把它转换成像这样的东西:

代码语言:javascript
运行
复制
4 times #HELLO end
4 times #WORLD end
#FOO
#BAR
#WORLD

这就是说,我希望将连续的重复字符串分组为一个,并将数量放在一边。

有没有一种聪明的方法可以使用Ruby的函数式编程能力或其他技术来做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-03 16:52:38

试试这个:

代码语言:javascript
运行
复制
str = "#HELLO
#HELLO
#HELLO
#HELLO
#WORLD
#WORLD
#WORLD
#WORLD
#FOO
#BAR
#WORLD"

result = ""
identical_lines = 1
str << "\n " # we need a last line to compare

str.lines.each_cons(2) do |line1,line2|
  if line1 == line2
    identical_lines += 1
  elsif identical_lines > 1
    result << "#{identical_lines} times #{line1.chomp} end\n"
    identical_lines = 1
  else
    result << line1
  end
end

puts result

此程序输出

代码语言:javascript
运行
复制
4 times #HELLO end
4 times #WORLD end
#FOO
#BAR
#WORLD
票数 1
EN

Stack Overflow用户

发布于 2012-07-03 16:48:53

如果你在一个类似unix的机器上,你可能可以通过uniq -c来传递你的输出。在此之后,您可能需要使用sed稍微清理一下输出,但它应该相对简单。

然而,我确信也有一个整洁的纯ruby解决方案。

票数 1
EN

Stack Overflow用户

发布于 2012-07-03 17:02:16

如下所示:

代码语言:javascript
运行
复制
text.each_line.each_with_object(Hash.new(0)).do |e,h|
  h[e.chomp] += 1
end.each.map do |k,v|
  v > 1 ? "#{v} times #{k} end" : k
end.tap do |array|
  File.open(...) { |f| array.each { |e| f.puts e } }
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11307211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档