基于数组内容Ruby插入到特定位置的数组中

时间:2017-04-04 00:08:18

标签: ruby-on-rails arrays ruby

我有一个对象数组,这些对象按照此对象的某个属性排序,我想在另一个对象中插入由该对象的该属性确定的位置。

基本上是这样的:
foo = [User(score: 10), User(score: 8), User(score: 5), User(score: 1)]
在那个数组中,我想插入:
bar = User(score: 6)
在正确的索引处,在这种情况下,在索引2处。

我可以将它推送到数组然后sort_by,但我想知道是否有更好的解决方案来解决这个问题(某种插入方法,你可以传递一个块来定义索引)。 / p>

提前致谢:)

2 个答案:

答案 0 :(得分:2)

你可以找到索引然后插入,如果你想避免完整的排序。像 -

这样的东西
insert_index = foo.index { |x| x.score <= new_user.score } || -1
foo.insert(insert_index, new_user)

答案 1 :(得分:0)

<强>代码

def insert_new(arr, new_instance)
  arr.insert(arr.index { |instance| new_instance.score >= instance.score } || -1,
    new_instance)
end

示例

class A
  def initialize(user, score)
    @user, @score = user, score
  end
end

arr = [A.new("Hank", 10), A.new("Lois", 8), A.new("Billy-Bob", 6),
       A.new("Trixy", 4)]
  #=> [#<A:0x007fad7b02fd70 @user="Hank", @score=10>,
  #    #<A:0x007fad7b02fcf8 @user="Lois", @score=8>,
  #    #<A:0x007fad7b02fc80 @user="Billy-Bob", @score=6>,
  #    #<A:0x007fad7b02fbe0 @user="Trixy", @score=4>]

insert_new(arr, A.new("Hubert", 7))
  #=> [#<A:0x007fad7a027450 @user="Hank", @score=10>,
  #    #<A:0x007fad7a0273b0 @user="Lois", @score=8>,
  #    #<A:0x007fad7a850b90 @user="Hubert", @score=7>,
  #    #<A:0x007fad7a027310 @user="Billy-Bob", @score=6>,
  #    #<A:0x007fad7a027270 @user="Trixy", @score=4>] 
insert_new(arr, A.new("Zelda", 2))
  #=> [#<A:0x007fad7a027450 @user="Hank", @score=10>,
  #    #<A:0x007fad7a0273b0 @user="Lois", @score=8>,
  #    #<A:0x007fad7a850b90 @user="Hubert", @score=7>, 
  #    #<A:0x007fad7a027310 @user="Billy-Bob", @score=6>,
  #    #<A:0x007fad7a027270 @user="Trixy", @score=4>,
  #    #<A:0x007fad7b876128 @user="Zelda", @score=2>]
insert_new(arr, A.new("Slim", 8))
  #    Slim is inserted between Hank and Lois
insert_new(arr, A.new("Rhonda", 8))
  #    Rhonda is inserted between Hank and Slim

注意

请注意,Zelda最后插入了。在那种情况下,

arr.index { |instance| new_instance.score >= instance.score } #=> nil

所以使用了索引-1... || -1),这意味着要在arr的最后一个元素之后插入值。请参阅String#insert