코드
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
주
공지 사항이 젤다 끝 부분에 삽입되었습니다. 이 경우
arr.index { |instance| new_instance.score >= instance.score } #=> nil
은 그렇게 인덱스 -1
는 값 arr
의 마지막 요소 이후에 삽입되는 것을 의미한다 (... || -1
)를 사용 하였다. String#insert을 참조하십시오.
이 솔루션이 귀하의 목적에 적합 할 수 있다고 생각합니다. http://stackoverflow.com/questions/23481725/using-bsearch-to-find-index-for-inserting-new-element-into-sorted-array –