zoukankan      html  css  js  c++  java
  • ruby楼层排序问题

    求教楼层排序问题

    要求正确楼层排序为: B2,B1,1F,2F,3F...10F,11F

    现有这13个无序的楼层 怎么排列成上面的格式?
    求教

    luikore 1楼 , 19小时前 1人喜欢

    sort_by {|f| f.start_with?('B') ? -f[1..-1].to_i : f.to_i}

     
    __main__ 2楼 , 5小时前 喜欢
    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
    
     
    __main__ 3楼 , 5小时前 喜欢

    上面那个太啰嗦了,应该可以简化下

    a = %w{ 1F B2 B1 B4 B3 2F 10F 11F 3F }
    
    a.sort! do |i1, i2|
      n1 = i1.sub(/[BF]/, {'F' => 0, 'B' => '-'}).to_i
      n2 = i2.sub(/[BF]/, {'F' => 0, 'B' => '-'}).to_i  
      n1 < n2 ? -1  : 1
    end
    
     
    zfjoy520 4楼 , 4小时前 喜欢

    @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
    
  • 相关阅读:
    “中国半导体教父”张汝京:中国半导体只缺人才
    集群搭建
    Scrapy
    商品建模
    python wordcloud
    StaticFileMiddleware中间件如何处理针对文件请求
    Docker / CI / CD
    NET Memory Profiler 跟踪.net 应用内存
    SOS.dll (SOS Debugging Extension)
    Download the WDK, WinDbg, and associated tools
  • 原文地址:https://www.cnblogs.com/wangyuyu/p/3340671.html
Copyright © 2011-2022 走看看