代码之家  ›  专栏  ›  技术社区  ›  Ju Nogueira

查找数组中最常见的字符串

  •  20
  • Ju Nogueira  · 技术社区  · 16 年前

       x = ["1.111", "1.122", "1.250", "1.111"]
    

    我需要找到最普遍的价值( "1.111" 在这种情况下)。

    提前准备!


    谢谢大家的回答!


    编辑#2:

    6 回复  |  直到 16 年前
        1
  •  43
  •   Wayne Conrad    11 年前

    红宝石<2.2

    #!/usr/bin/ruby1.8
    
    def most_common_value(a)
      a.group_by do |e|
        e
      end.values.max_by(&:size).first
    end
    
    x = ["1.111", "1.122", "1.250", "1.111"]
    p most_common_value(x)    # => "1.111"
    

    Enumberable.max_by 在Ruby1.9中是新的,但是它已经被后移植到了1.8.7

    Ruby2.2引入了 Object#itself

    def most_common_value(a)
      a.group_by(&:itself).values.max_by(&:size).first
    end
    

    作为一个猴子补丁

    或作为 Enumerable#mode :

    Enumerable.class_eval do
      def mode
        group_by do |e|
          e
        end.values.max_by(&:size).first
      end
    end
    
    ["1.111", "1.122", "1.250", "1.111"].mode
    # => "1.111"
    
        2
  •  5
  •   Wayne Conrad    15 年前

    #!/usr/bin/ruby
    
    a = Hash.new(0)
    ["1.111", "1.122", "1.250", "1.111"].each { |num|
      a[num] += 1
    }
    
    a.max{ |a,b| a[1] <=> b[1] } # => ["1.111", 2]
    

    或者,把它全部卷成一行:

    ary.inject(Hash.new(0)){ |h,i| h[i] += 1; h }.max{ |a,b| a[1] <=> b[1] } # => ["1.111", 2]
    

    如果您只想返回项目,请添加.first():

    ary.inject(Hash.new(0)){ |h,i| h[i] += 1; h }.max{ |a,b| a[1] <=> b[1] }.first # => "1.111"
    

    #!/usr/bin/env ruby
    
    require 'benchmark'
    
    ary = ["1.111", "1.122", "1.250", "1.111"] * 1000 
    
    def most_common_value(a)
      a.group_by { |e| e }.values.max_by { |values| values.size }.first
    end
    
    n = 1000
    Benchmark.bm(20) do |x|
      x.report("Hash.new(0)") do
        n.times do 
          a = Hash.new(0)
          ary.each { |num| a[num] += 1 }
          a.max{ |a,b| a[1] <=> b[1] }.first
        end 
      end
    
      x.report("inject:") do
        n.times do
          ary.inject(Hash.new(0)){ |h,i| h[i] += 1; h }.max{ |a,b| a[1] <=> b[1] }.first
        end
      end
    
      x.report("most_common_value():") do
        n.times do
          most_common_value(ary)
        end
      end
    end
    

    结果如下:

                              user     system      total        real
    Hash.new(0)           2.150000   0.000000   2.150000 (  2.164180)
    inject:               2.440000   0.010000   2.450000 (  2.451466)
    most_common_value():  1.080000   0.000000   1.080000 (  1.089784)
    
        3
  •  4
  •   Justin Ethier    16 年前

    max_count == count 如果 count > max_count . 当然,也要注意哪一项是最重要的 max_count .

        4
  •  2
  •   Jeremy    16 年前

    ["1.111", "1.122", "1.250", "1.111"].each { |num|
      count=your_hash_map.get(num)
      if(item==nil)
        hashmap.put(num,1)
      else
        hashmap.put(num,count+1)
    }
    

    如前所述,排序可能更快。

        5
  •  2
  •   Josh Lee ZZ Coder    16 年前

    使用哈希的默认值功能:

    >> x = ["1.111", "1.122", "1.250", "1.111"]
    >> h = Hash.new(0)
    >> x.each{|i| h[i] += 1 }
    >> h.max{|a,b| a[1] <=> b[1] }
    ["1.111", 2]
    
        6
  •  0
  •   fl00r    16 年前

    它将返回数组中最常用的值

    x.group_by{|a| a }.sort_by{|a,b| b.size<=>a.size}.first[0]
    

    即:

    x = ["1.111", "1.122", "1.250", "1.111"]
    # Most popular
    x.group_by{|a| a }.sort_by{|a,b| b.size<=>a.size}.first[0]
    #=> "1.111
    # How many times
    x.group_by{|a| a }.sort_by{|a,b| b.size<=>a.size}.first[1].size
    #=> 2