ruby楼层排序问题
求教楼层排序问题
要求正确楼层排序为: B2,B1,1F,2F,3F...10F,11F
现有这13个无序的楼层 怎么排列成上面的格式?
求教
a = %w{ 1F B2 B1 B4 B3 2F 10F 11F 3F }
a.sort! do |i1, i2|
is_b1 = i1.start_with? 'B'
is_b2 = i2.start_with? 'B'
n1 = i1.sub(/[a-z]/i, '').to_i
n2 = i2.sub(/[a-z]/i, '').to_i
case
when is_b1 != is_b2 then is_b1 ? -1 : 1
when is_b1 && is_b2 then n1 < n2 ? 1 : -1
else n1 < n2 ? -1 : 1
end
end
puts a
@datty258
@luikore
想到有另外一种方法,不过还是@luikore 的方法最优,性能差距好几倍。
arr1 = (1 .. 18).collect { |i| ["B#{i}", "#{i}F"] }.flatten.shuffle
法一:arr2 = arr1.sort_by { |f| f.start_with?('B') ? -f[1..-1].to_i : f.to_i }
法二:arr3 = arr1.sort_by { |f| f.sub(/B/i, '-').to_i }
如果不考虑字母 'B' 的大小写问题,可以把sub后面的 'i' 去掉。性能又可以提升不少。
法三:arr4 = arr1.sort_by { |f| f.sub(/B/, '-').to_i }
=> ["B18", "B17", "B16", "B15", "B14", "B13", "B12", "B11", "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "1F", "2F", "3F", "4F", "5F", "6F", "7F", "8F", "9F", "10F", "11F", "12F", "13F", "14F", "15F", "16F", "17F", "18F"]
arr2 == arr3
=> true
arr3 == arr4
=> true
性能对比:
irb(main):336:0> i = Time.now; 1000.times { arr1.sort_by { |f| f.start_with?('B') ? -f[1..-1].to_i : f.to_i } }; Time.now - i
=> 0.04322
irb(main):337:0> i = Time.now; 1000.times { arr1.sort_by { |f| f.sub(/B/i, '-').to_i } }; Time.now - i
=> 0.171414
irb(main):338:0> i = Time.now; 1000.times { arr1.sort_by { |f| f.sub(/B/, '-').to_i } }; Time.now - i
=> 0.131904
ruby楼层排序问题的更多相关文章
- 编程之美—烙饼排序问题(JAVA)
一.问题描述 星期五的晚上,一帮同事在希格玛大厦附近的"硬盘酒吧"多喝了几杯.程序员多喝了几杯之后谈什么呢?自然是算法问题.有个同事说:"我以前在餐 馆打工,顾 ...
- 安装cocoapods遇到两大坑-Ruby版本升级和Podfile的配置
今天安装cocoapods #移除原有ruby源 $ gem sources --remove https://rubygems.org/ #使用可用的淘宝网 $ gem sources -a htt ...
- Unable to download data from http://ruby.taobao.org/ & don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
安装cocoapods,记录两个问题! 1.镜像已经替换成了 http://ruby.taobao.org/, 还是不能不能安装cocoapods, 报错:Unable to download dat ...
- 安装了ruby后怎么安装sass
在命令行中输入 ruby -v 查看版本号 先移除默认的https://rubygems.org源,命令为gem sources --remove https://rubygems.org/,按回车 ...
- ruby 基础知识(一)
突然今天发现一大神的博客:http://www.cnblogs.com/jackluo/archive/2013/01/22/2871655.html 相信初学者会受益颇多 ruby 参考文档 ...
- ruby 基础知识(二)
ruby 中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...
- Ruby安装Scss
Ruby安装Scss 引言 已经许久不写HTML了,今天有点以前的东西要改.但是刚装的Windows10,已经没有以前的Web开发环境了.只好重新安装. 结果Webstorm装好后配置Scss出现错误 ...
- fzf by ruby
fzf by ruby */--> fzf by ruby 1 github地址 https://github.com/junegunn/fzf 2 简介 软件通过匿名管道和grep扩展了bas ...
- The Safe Navigation Operator (&.) in Ruby
The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(&.). A similar opera ...
随机推荐
- WebApi使用JWT认证(一)
这是第一部:先实现NetFramework上的WebApi使用JWT认证 1.VS新建一个WebApi项目 2.项目右键----管理Nuget程序包----找到JWT,然后安装 3.Model文件夹下 ...
- Python学习-18.Python中的错误处理(三)
在某些情况下,我们需要定义自己的异常并且抛出 先定义一个错误: class MyError(BaseException): def __init__(self): pass 上面定义了一个叫MyErr ...
- 在Sublime中集成Team Foundation Server (TFS),实现版本管理
Sublime是一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,由于它开发的技术架构.丰富的插件,和轻盈而快速的编程响应,Sublime广受程序员的爱好.在C, C++, Javascri ...
- Email feedback to product team about TFS and SharePoint Integration 2017.2.15
SharePoint与Team Foundation Server的集成,一直是许多研发团队所关注的问题. 通过这种集成,开发团队可以实现下面的几个功能: 1. 搭建一个与团队项目集成的门户网站,并 ...
- OpenDiscussion_DataDrivenDesign
本文源于公司内部技术交流,如有不当之处,还请指正. Content: 1. What is Data-driven design? 2. WPF revolution. 3. More about O ...
- C#内存释放(垃圾回收)
今天写了个很小的程序,程序的功能仅仅是截图,但是如果长时间开启并截图的时候,程序会变的很大,从刚开始的运行在任务管理器中只有十几K大小,运行一段时间后在任务管理器中看到程序可以达到1G或2G甚至更大: ...
- MVVM前端框架
早开始接触MVVM框架的时候,是在学习WPF的时候,后面陆陆续续接触到了很多的前端JS框架,个人觉得大同小异,也没有去研究源代码,所以都停留在使用的阶段.当然对于我来说,使用这些JS框架,最关注的无非 ...
- .net core 基于Jwt实现Token令牌
Startup类ConfigureServices中 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJw ...
- c# 调用短信平台接口,给手机发送短信
项目上要做个发手机短信的功能.网上找找了,用的微米的短信接口. 注册后,获得UID和UID key,C#代码中需要这个 调用代码很简单 ", con = "[微米]您的验证码是:6 ...
- css 可拖拽列表
<!DOCTYPE HTML> <html><head> <meta charset="UTF-8"> <title>d ...