我有一个对象数组,这些对象按照此对象的某个属性排序,我想在另一个对象中插入由该对象的该属性确定的位置。
基本上是这样的:
foo = [User(score: 10), User(score: 8), User(score: 5), User(score: 1)]
在那个数组中,我想插入:
bar = User(score: 6)
在正确的索引处,在这种情况下,在索引2处。
我可以将它推送到数组然后sort_by
,但我想知道是否有更好的解决方案来解决这个问题(某种插入方法,你可以传递一个块来定义索引)。 / p>
提前致谢:)
答案 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。