代码之家  ›  专栏  ›  技术社区  ›  astropanic

填充稀疏数组

  •  0
  • astropanic  · 技术社区  · 15 年前

    我有一个稀疏数组,例如:

    rare = [[0,1], [2,3], [4,5], [7,8]]
    

    我想用这些数据绘制一个图表,每对都是点坐标。 如你所见,我没有X=1,X=3,X=5,X=6的分数

    我想用前面的值填充数组,因此对于上面的示例,我将得到:

    filled = [[0,1], [1,1], [2,3], [3,3], [4,5], [5,5], [6,5], [7,8]
    

    如你所见,为了计算y值,我只取最后一个y值。

    实现这一目标的最佳途径是什么?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Mladen Jablanović    15 年前
    Range.new(*rare.transpose.first.sort.values_at(0,-1)).inject([]){|a,i|
      a<<[i, Hash[rare][i] || a.last.last]
    }
    

    逐步说明:

    1. rare.transpose.first.sort.values_at(0,-1) 查找最小值和最大值 x ( [0,7] 在您的示例中)
    2. Range.new() 超出范围( 0..7 )
    3. inject 循环访问范围和 X 返回对 [x,y] ,在哪里 y 是:
      1. Y 来自输入数组,其中定义了
      2. Y 从先前评估的对中,其中

    注:以下是求最小值和最大值x的其他方法:

    [:min,:max].map{|m| Hash[rare].keys.send m}
    rare.map{|el| el.first}.minmax # Ruby 1.9, by steenslag
    
        2
  •  2
  •   Wayne Conrad    15 年前
    rare = [[0,1], [2,3], [4,5], [7,8]]
    
    filled = rare.inject([]) do |filled, point|
      extras = if filled.empty?
                 []
               else
                 (filled.last[0] + 1 ... point[0]).collect do |x|
                   [x, filled.last[1]]
                 end
               end
      filled + extras + [point]
    end
    
    p filled
    # => [[0, 1], [1, 1], [2, 3], [3, 3], [4, 5], [5, 5], [6, 5], [7, 8]]
    
        3
  •  2
  •   tokland    15 年前

    inject 解决方案:

    filled = rare.inject([]) do |filled_acc, (pair_x, pair_y)|
      padded_pairs = unless filled_acc.empty?    
        last_x, last_y = filled_acc.last
        (last_x+1...pair_x).map { |x| [x, last_y] }
      end || []
      filled_acc + padded_pairs + [[pair_x, pair_y]] 
    end
    

    更多关于 Enumerable#inject 和Ruby函数编程 here .

        4
  •  0
  •   ghostdog74    15 年前
    irb(main):001:0> rare = [[0,1], [2,3], [4,5], [7,8]]
    => [[0, 1], [2, 3], [4, 5], [7, 8]]
    irb(main):002:0> r=rare.transpose
    => [[0, 2, 4, 7], [1, 3, 5, 8]]
    irb(main):003:0> iv = (r[0][0]..r[0][-1]).to_a.select {|w| !r[0].include?(w) }
    => [1, 3, 5, 6]
    irb(main):004:0> r[1][-1]=r[1][-2]
    => 5
    irb(main):005:0> p (iv.zip(r[1]) + rare).sort
    [[0, 1], [1, 1], [2, 3], [3, 3], [4, 5], [5, 5], [6, 5], [7, 8]]
    => [[0, 1], [1, 1], [2, 3], [3, 3], [4, 5], [5, 5], [6, 5], [7, 8]]